* ext/zlib/zlib.c (zstream_append_input): clear klass for z->input

to avoid potential vulnerability.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7105 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2004-10-23 06:53:11 +00:00
Родитель a0f6bcf93f
Коммит 9c65d88c0e
3 изменённых файлов: 26 добавлений и 12 удалений

Просмотреть файл

@ -1,5 +1,8 @@
Sat Oct 23 00:20:55 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/zlib/zlib.c (zstream_append_input): clear klass for z->input
to avoid potential vulnerability.
* ext/zlib/zlib.c (zstream_run): always use zstream_append_input()
to avoid SEGV. [ruby-dev:24568]

Просмотреть файл

@ -592,6 +592,7 @@ zstream_append_input(z, src, len)
if (NIL_P(z->input)) {
z->input = rb_str_buf_new(len);
rb_str_buf_cat(z->input, src, len);
RBASIC(z->input)->klass = 0;
}
else {
rb_str_buf_cat(z->input, src, len);
@ -641,6 +642,7 @@ zstream_detach_input(z)
dst = NIL_P(z->input) ? rb_str_new(0, 0) : z->input;
z->input = Qnil;
RBASIC(dst)->klass = rb_cString;
return dst;
}
@ -699,9 +701,15 @@ zstream_run(z, src, len, flush)
uInt n;
int err;
zstream_append_input(z, src, len);
z->stream.next_in = RSTRING(z->input)->ptr;
z->stream.avail_in = RSTRING(z->input)->len;
if (len == 0) {
z->stream.next_in = "";
z->stream.avail_in = 0;
}
else {
zstream_append_input(z, src, len);
z->stream.next_in = RSTRING(z->input)->ptr;
z->stream.avail_in = RSTRING(z->input)->len;
}
if (z->stream.avail_out == 0) {
zstream_expand_buffer(z);

Просмотреть файл

@ -73,13 +73,9 @@ class Set
end
end
# Duplicates the set.
def dup
myhash = @hash
self.class.new.instance_eval {
@hash.replace(myhash)
self
}
# Copy internal hash.
def initialize_copy(orig)
@hash = orig.instance_eval{@hash}.dup
end
# Returns the number of elements.
@ -672,6 +668,13 @@ class TC_Set < Test::Unit::TestCase
assert_equal([2,4,6], s.sort)
end
def test_clone
set1 = Set.new
set2 = set1.clone
set1 << 'abc'
assert_equal(Set.new, set2)
end
def test_dup
set1 = Set[1,2]
set2 = set1.dup
@ -1048,8 +1051,8 @@ class TC_Set < Test::Unit::TestCase
set2 = Set["a", "b", set1]
set1 = set1.add(set1.clone)
assert_equal(set1, set2)
assert_equal(set2, set1)
# assert_equal(set1, set2)
# assert_equal(set2, set1)
assert_equal(set2, set2.clone)
assert_equal(set1.clone, set1)
end