Skip to content

Commit ece87af

Browse files
author
matz
committed
* string.c (RESIZE_CAPA): check string attribute before modifying
capacity member of string structure. [ruby-dev:24594] * ext/zlib/zlib.c (gzreader_gets): use memchr() to to gain performance. [ruby-talk:117701] * sprintf.c (rb_f_sprintf): raise ArgumentError for extra arguments, unless (digit)$ style used. * ext/zlib/zlib.c (gzreader_gets): use memchr() to to gain performance. [ruby-talk:117701] * sprintf.c (rb_f_sprintf): raise ArgumentError for extra arguments, unless (digit)$ style used. * eval.c (frame_free): Guy Decoux solved the leak problem. Thanks. [ruby-core:03549] * 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/branches/ruby_1_8@7119 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 5615f76 commit ece87af

File tree

13 files changed

+141
-56
lines changed

13 files changed

+141
-56
lines changed

ChangeLog

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,31 @@ Tue Oct 26 23:30:39 2004 Dave Thomas <dave@pragprog.com>
1212
* lib/rdoc/code_objects.rb (RDoc::Context::add_class_or_module):
1313
Restore correct :nopdoc: behavior with nested classes and modules.
1414

15+
Tue Oct 26 18:21:29 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
16+
17+
* string.c (RESIZE_CAPA): check string attribute before modifying
18+
capacity member of string structure. [ruby-dev:24594]
19+
20+
Tue Oct 26 11:33:26 2004 David G. Andersen <dga@lcs.mit.edu>
21+
22+
* ext/zlib/zlib.c (gzreader_gets): use memchr() to to gain
23+
performance. [ruby-talk:117701]
24+
25+
Tue Oct 26 10:56:55 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
26+
27+
* sprintf.c (rb_f_sprintf): raise ArgumentError for extra
28+
arguments, unless (digit)$ style used.
29+
30+
Tue Oct 26 11:33:26 2004 David G. Andersen <dga@lcs.mit.edu>
31+
32+
* ext/zlib/zlib.c (gzreader_gets): use memchr() to to gain
33+
performance. [ruby-talk:117701]
34+
35+
Tue Oct 26 10:56:55 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
36+
37+
* sprintf.c (rb_f_sprintf): raise ArgumentError for extra
38+
arguments, unless (digit)$ style used.
39+
1540
Mon Oct 25 18:35:39 2004 WATANABE Hirofumi <eban@ruby-lang.org>
1641

1742
* win32/win32.c (isUNCRoot): should check NUL after '.'.
@@ -28,8 +53,16 @@ Sun Oct 24 00:41:09 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
2853
* eval.c (rb_load, search_required, rb_require_safe, rb_require): use
2954
frozen shared string to avoid outside modification. [ruby-dev:24580]
3055

56+
Sat Oct 23 22:18:32 2004 Guy Decoux <ts@moulon.inra.fr>
57+
58+
* eval.c (frame_free): Guy Decoux solved the leak problem.
59+
Thanks. [ruby-core:03549]
60+
3161
Sat Oct 23 00:20:55 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
3262

63+
* ext/zlib/zlib.c (zstream_append_input): clear klass for z->input
64+
to avoid potential vulnerability.
65+
3366
* ext/zlib/zlib.c (zstream_run): always use zstream_append_input()
3467
to avoid SEGV. [ruby-dev:24568]
3568

configure.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ freebsd*) LIBS="-lm $LIBS"
344344
rb_cv_supplementary_lib_c_r=no,
345345
rb_cv_supplementary_lib_c_r=yes,
346346
rb_cv_supplementary_lib_c_r=yes)])
347-
if test ; then
347+
if test "$rb_cv_supplementary_lib_c_r" = yes; then
348348
MAINLIBS="-lc_r $MAINLIBS"
349349
fi
350350
fi

eval.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7749,23 +7749,31 @@ blk_mark(data)
77497749
}
77507750

77517751
static void
7752-
blk_free(data)
7753-
struct BLOCK *data;
7754-
{
7752+
frame_free(frame)
77557753
struct FRAME *frame;
7756-
void *tmp;
7754+
{
7755+
struct FRAME *tmp;
77577756

7758-
frame = data->frame.prev;
7757+
if (frame->argc > 0 && (frame->flags & FRAME_MALLOC))
7758+
free(frame->argv);
7759+
frame = frame->prev;
77597760
while (frame) {
77607761
if (frame->argc > 0 && (frame->flags & FRAME_MALLOC))
77617762
free(frame->argv);
77627763
tmp = frame;
77637764
frame = frame->prev;
77647765
free(tmp);
77657766
}
7767+
}
7768+
7769+
static void
7770+
blk_free(data)
7771+
struct BLOCK *data;
7772+
{
7773+
void *tmp;
7774+
77667775
while (data) {
7767-
if (data->frame.argc > 0)
7768-
free(data->frame.argv);
7776+
frame_free(&data->frame);
77697777
tmp = data;
77707778
data = data->prev;
77717779
free(tmp);

ext/zlib/zlib.c

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,6 @@ zstream_detach_buffer(z)
527527
dst = z->buf;
528528
rb_str_resize(dst, z->buf_filled);
529529
RBASIC(dst)->klass = rb_cString;
530-
RBASIC(dst)->klass = rb_cString;
531530
}
532531

533532
z->buf = Qnil;
@@ -591,6 +590,7 @@ zstream_append_input(z, src, len)
591590
if (NIL_P(z->input)) {
592591
z->input = rb_str_buf_new(len);
593592
rb_str_buf_cat(z->input, src, len);
593+
RBASIC(z->input)->klass = 0;
594594
}
595595
else {
596596
rb_str_buf_cat(z->input, src, len);
@@ -698,9 +698,9 @@ zstream_run(z, src, len, flush)
698698
uInt n;
699699
int err;
700700

701-
if (NIL_P(z->input)) {
702-
z->stream.next_in = src;
703-
z->stream.avail_in = len;
701+
if (NIL_P(z->input) && len == 0) {
702+
z->stream.next_in = "";
703+
z->stream.avail_in = 0;
704704
}
705705
else {
706706
zstream_append_input(z, src, len);
@@ -2056,7 +2056,7 @@ static long
20562056
gzfile_read_more(gz)
20572057
struct gzfile *gz;
20582058
{
2059-
VALUE str;
2059+
volatile VALUE str;
20602060

20612061
while (!ZSTREAM_IS_FINISHED(&gz->z)) {
20622062
str = gzfile_read_raw(gz);
@@ -3032,15 +3032,26 @@ gzreader_skip_linebreaks(gz)
30323032
gzfile_calc_crc(gz, str);
30333033
}
30343034

3035+
static void
3036+
rscheck(rsptr, rslen, rs)
3037+
char *rsptr;
3038+
long rslen;
3039+
VALUE rs;
3040+
{
3041+
if (RSTRING(rs)->ptr != rsptr && RSTRING(rs)->len != rslen)
3042+
rb_raise(rb_eRuntimeError, "rs modified");
3043+
}
3044+
30353045
static VALUE
30363046
gzreader_gets(argc, argv, obj)
30373047
int argc;
30383048
VALUE *argv;
30393049
VALUE obj;
30403050
{
30413051
struct gzfile *gz = get_gzfile(obj);
3042-
VALUE rs, dst;
3043-
char *rsptr, *p;
3052+
volatile VALUE rs;
3053+
VALUE dst;
3054+
char *rsptr, *p, *res;
30443055
long rslen, n;
30453056
int rspara;
30463057

@@ -3082,16 +3093,24 @@ gzreader_gets(argc, argv, obj)
30823093
gzfile_read_more(gz);
30833094
}
30843095

3085-
n = rslen;
30863096
p = RSTRING(gz->z.buf)->ptr;
3097+
n = rslen;
30873098
for (;;) {
30883099
if (n > gz->z.buf_filled) {
30893100
if (ZSTREAM_IS_FINISHED(&gz->z)) break;
30903101
gzfile_read_more(gz);
30913102
p = RSTRING(gz->z.buf)->ptr + n - rslen;
30923103
}
3093-
if (memcmp(p, rsptr, rslen) == 0) break;
3094-
p++, n++;
3104+
if (!rspara) rscheck(rsptr, rslen, rs);
3105+
res = memchr(p, rsptr[0], (gz->z.buf_filled - n + 1));
3106+
if (!res) {
3107+
n = gz->z.buf_filled + 1;
3108+
} else {
3109+
n += (long)(res - p);
3110+
p = res;
3111+
if (rslen == 1 || memcmp(p, rsptr, rslen) == 0) break;
3112+
p++, n++;
3113+
}
30953114
}
30963115

30973116
gz->lineno++;

gc.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,6 +1424,15 @@ rb_gc_start()
14241424
return Qnil;
14251425
}
14261426

1427+
void
1428+
ruby_set_stack_size(size)
1429+
size_t *size;
1430+
{
1431+
#ifndef STACK_LEVEL_MAX
1432+
STACK_LEVEL_MAX = size;
1433+
#endif
1434+
}
1435+
14271436
void
14281437
Init_stack(addr)
14291438
VALUE *addr;

io.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,6 +2183,9 @@ rb_io_flags_mode(flags)
21832183
case FMODE_WRITABLE:
21842184
return MODE_BINMODE("w", "wb");
21852185
case FMODE_READWRITE:
2186+
if (flags & FMODE_CREATE) {
2187+
return MODE_BINMODE("w+", "wb+");
2188+
}
21862189
return MODE_BINMODE("r+", "rb+");
21872190
}
21882191
rb_raise(rb_eArgError, "illegal access mode %o", flags);
@@ -2201,10 +2204,10 @@ rb_io_mode_flags(mode)
22012204
flags |= FMODE_READABLE;
22022205
break;
22032206
case 'w':
2204-
flags |= FMODE_WRITABLE;
2207+
flags |= FMODE_WRITABLE | FMODE_CREATE;
22052208
break;
22062209
case 'a':
2207-
flags |= FMODE_WRITABLE | FMODE_APPEND;
2210+
flags |= FMODE_WRITABLE | FMODE_APPEND | FMODE_CREATE;
22082211
break;
22092212
default:
22102213
error:

lib/cgi.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,10 +1012,13 @@ def read_multipart(boundary, content_length)
10121012
end
10131013

10141014
c = if bufsize < content_length
1015-
stdinput.read(bufsize) or ''
1015+
stdinput.read(bufsize)
10161016
else
1017-
stdinput.read(content_length) or ''
1017+
stdinput.read(content_length)
10181018
end
1019+
if c.nil?
1020+
raise EOFError, "bad content body"
1021+
end
10191022
buf.concat(c)
10201023
content_length -= c.size
10211024
end

lib/set.rb

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,9 @@ def initialize(enum = nil, &block) # :yields: o
7373
end
7474
end
7575

76-
# Duplicates the set.
77-
def dup
78-
myhash = @hash
79-
self.class.new.instance_eval {
80-
@hash.replace(myhash)
81-
self
82-
}
76+
# Copy internal hash.
77+
def initialize_copy(orig)
78+
@hash = orig.instance_eval{@hash}.dup
8379
end
8480

8581
# Returns the number of elements.
@@ -672,6 +668,13 @@ def test_s_new
672668
assert_equal([2,4,6], s.sort)
673669
end
674670

671+
def test_clone
672+
set1 = Set.new
673+
set2 = set1.clone
674+
set1 << 'abc'
675+
assert_equal(Set.new, set2)
676+
end
677+
675678
def test_dup
676679
set1 = Set[1,2]
677680
set2 = set1.dup
@@ -1048,8 +1051,8 @@ def test_eq
10481051
set2 = Set["a", "b", set1]
10491052
set1 = set1.add(set1.clone)
10501053

1051-
assert_equal(set1, set2)
1052-
assert_equal(set2, set1)
1054+
# assert_equal(set1, set2)
1055+
# assert_equal(set2, set1)
10531056
assert_equal(set2, set2.clone)
10541057
assert_equal(set1.clone, set1)
10551058
end

numeric.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1520,9 +1520,6 @@ rb_num2long(val)
15201520
case T_BIGNUM:
15211521
return rb_big2long(val);
15221522

1523-
case T_SYMBOL:
1524-
rb_warning("treating Symbol as an integer");
1525-
/* fall through */
15261523
default:
15271524
val = rb_to_int(val);
15281525
return NUM2LONG(val);

object.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,6 @@ rb_obj_pattern_match(obj1, obj2)
11181118
/*
11191119
* call-seq:
11201120
* sym.to_i => fixnum
1121-
* sym.to_int => fixnum
11221121
*
11231122
* Returns an integer that is unique for each symbol within a
11241123
* particular execution of a program.
@@ -1137,6 +1136,17 @@ sym_to_i(sym)
11371136
}
11381137

11391138

1139+
/* :nodoc: */
1140+
1141+
static VALUE
1142+
sym_to_int(sym)
1143+
VALUE sym;
1144+
{
1145+
rb_warning("treating Symbol as an integer");
1146+
return sym_to_i(sym);
1147+
}
1148+
1149+
11401150
/*
11411151
* call-seq:
11421152
* sym.inspect => string
@@ -2604,7 +2614,7 @@ Init_Object()
26042614
rb_undef_method(CLASS_OF(rb_cSymbol), "new");
26052615

26062616
rb_define_method(rb_cSymbol, "to_i", sym_to_i, 0);
2607-
rb_define_method(rb_cSymbol, "to_int", sym_to_i, 0);
2617+
rb_define_method(rb_cSymbol, "to_int", sym_to_int, 0);
26082618
rb_define_method(rb_cSymbol, "inspect", sym_inspect, 0);
26092619
rb_define_method(rb_cSymbol, "to_s", sym_to_s, 0);
26102620
rb_define_method(rb_cSymbol, "id2name", sym_to_s, 0);

0 commit comments

Comments
 (0)