Skip to content

Commit 012e50d

Browse files
committed
merge revision(s) 16564:
* marshal.c (reentrant_check): check reentrance via callcc. [ruby-dev:34802] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_5@17317 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 893e02d commit 012e50d

File tree

4 files changed

+39
-6
lines changed

4 files changed

+39
-6
lines changed

ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ Sun Jun 15 23:12:02 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
33
* parse.y (top_local_setup): fixed memory leak bug based on a
44
patch from Roger Pack <rogerpack2005 at gmail.com> in
55
[ruby-core:16610].
6+
Sun Jun 15 23:15:35 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
7+
8+
* marshal.c (reentrant_check): check reentrance via callcc.
9+
[ruby-dev:34802]
10+
611

712
Sun Jun 15 23:08:29 2008 NAKAMURA Usaku <usa@ruby-lang.org>
813

eval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5469,7 +5469,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
54695469
}
54705470
POP_TAG();
54715471
retval = prot_tag ? prot_tag->retval : Qnil; /* save retval */
5472-
(*e_proc)(data2);
5472+
(*e_proc)(data2);
54735473
if (prot_tag) return_value(retval);
54745474
if (state) JUMP_TAG(state);
54755475
return result;

marshal.c

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ static ID s_dump, s_load, s_mdump, s_mload;
8484
static ID s_dump_data, s_load_data, s_alloc;
8585
static ID s_getc, s_read, s_write, s_binmode;
8686

87+
static void
88+
reentrant_check(obj, sym)
89+
VALUE obj;
90+
ID sym;
91+
{
92+
if (RBASIC(obj)->klass) {
93+
rb_raise(rb_eRuntimeError, "%s reentered", rb_id2name(sym));
94+
}
95+
}
96+
8797
struct dump_arg {
8898
VALUE obj;
8999
VALUE str, dest;
@@ -505,6 +515,7 @@ w_object(obj, arg, limit)
505515
volatile VALUE v;
506516

507517
v = rb_funcall(obj, s_mdump, 0, 0);
518+
reentrant_check(arg->str, s_mdump);
508519
w_class(TYPE_USRMARSHAL, obj, arg, Qfalse);
509520
w_object(v, arg, limit);
510521
if (ivtbl) w_ivar(0, &c_arg);
@@ -514,6 +525,7 @@ w_object(obj, arg, limit)
514525
VALUE v;
515526

516527
v = rb_funcall(obj, s_dump, 1, INT2NUM(limit));
528+
reentrant_check(arg->str, s_dump);
517529
if (TYPE(v) != T_STRING) {
518530
rb_raise(rb_eTypeError, "_dump() must return string");
519531
}
@@ -658,6 +670,7 @@ w_object(obj, arg, limit)
658670
rb_obj_classname(obj));
659671
}
660672
v = rb_funcall(obj, s_dump_data, 0);
673+
reentrant_check(arg->str, s_dump_data);
661674
w_class(TYPE_DATA, obj, arg, Qtrue);
662675
w_object(v, arg, limit);
663676
}
@@ -690,11 +703,13 @@ static VALUE
690703
dump_ensure(arg)
691704
struct dump_arg *arg;
692705
{
706+
if (RBASIC(arg->str)->klass) return; /* ignore reentrant */
693707
st_free_table(arg->symbols);
694708
st_free_table(arg->data);
695709
if (arg->taint) {
696710
OBJ_TAINT(arg->str);
697711
}
712+
698713
return 0;
699714
}
700715

@@ -747,20 +762,21 @@ marshal_dump(argc, argv)
747762
else port = a1;
748763
}
749764
arg.dest = 0;
765+
arg.str = rb_str_buf_new(0);
766+
RBASIC(arg.str)->klass = 0;
750767
if (!NIL_P(port)) {
751768
if (!rb_respond_to(port, s_write)) {
752769
type_error:
753770
rb_raise(rb_eTypeError, "instance of IO needed");
754771
}
755-
arg.str = rb_str_buf_new(0);
756772
arg.dest = port;
757773
if (rb_respond_to(port, s_binmode)) {
758774
rb_funcall2(port, s_binmode, 0, 0);
775+
reentrant_check(arg.str, s_dump_data);
759776
}
760777
}
761778
else {
762-
port = rb_str_buf_new(0);
763-
arg.str = port;
779+
port = arg.str;
764780
}
765781

766782
arg.symbols = st_init_numtable();
@@ -774,6 +790,7 @@ marshal_dump(argc, argv)
774790
w_byte(MARSHAL_MINOR, &arg);
775791

776792
rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
793+
RBASIC(arg.str)->klass = rb_cString;
777794

778795
return port;
779796
}
@@ -806,6 +823,7 @@ r_byte(arg)
806823
else {
807824
VALUE src = arg->src;
808825
VALUE v = rb_funcall2(src, s_getc, 0, 0);
826+
reentrant_check(arg->data, s_getc);
809827
if (NIL_P(v)) rb_eof_error();
810828
c = (unsigned char)FIX2INT(v);
811829
}
@@ -886,6 +904,7 @@ r_bytes0(len, arg)
886904
VALUE src = arg->src;
887905
VALUE n = LONG2NUM(len);
888906
str = rb_funcall2(src, s_read, 1, &n);
907+
reentrant_check(arg->data, s_read);
889908
if (NIL_P(str)) goto too_short;
890909
StringValue(str);
891910
if (RSTRING(str)->len != len) goto too_short;
@@ -1239,6 +1258,7 @@ r_object0(arg, proc, ivp, extmod)
12391258
*ivp = Qfalse;
12401259
}
12411260
v = rb_funcall(klass, s_load, 1, data);
1261+
reentrant_check(arg->data, s_load);
12421262
r_entry(v, arg);
12431263
}
12441264
break;
@@ -1262,6 +1282,7 @@ r_object0(arg, proc, ivp, extmod)
12621282
r_entry(v, arg);
12631283
data = r_object(arg);
12641284
rb_funcall(v, s_mload, 1, data);
1285+
reentrant_check(arg->data, s_mload);
12651286
}
12661287
break;
12671288

@@ -1288,6 +1309,7 @@ r_object0(arg, proc, ivp, extmod)
12881309
warn = Qfalse;
12891310
}
12901311
v = rb_funcall(klass, s_alloc, 0);
1312+
reentrant_check(arg->data, s_alloc);
12911313
}
12921314
else {
12931315
v = rb_obj_alloc(klass);
@@ -1302,6 +1324,7 @@ r_object0(arg, proc, ivp, extmod)
13021324
rb_class2name(klass));
13031325
}
13041326
rb_funcall(v, s_load_data, 1, r_object0(arg, 0, 0, extmod));
1327+
reentrant_check(arg->data, s_load_data);
13051328
}
13061329
break;
13071330

@@ -1344,7 +1367,9 @@ r_object0(arg, proc, ivp, extmod)
13441367
break;
13451368
}
13461369
if (proc) {
1347-
rb_funcall(proc, rb_intern("call"), 1, v);
1370+
ID s_call =
1371+
rb_funcall(proc, s_call, 1, v);
1372+
reentrant_check(arg->data, s_call);
13481373
}
13491374
return v;
13501375
}
@@ -1367,6 +1392,7 @@ static VALUE
13671392
load_ensure(arg)
13681393
struct load_arg *arg;
13691394
{
1395+
if (RBASIC(arg->data)->klass) return; /* ignore reentrant */
13701396
st_free_table(arg->symbols);
13711397
return 0;
13721398
}
@@ -1424,9 +1450,11 @@ marshal_load(argc, argv)
14241450

14251451
arg.symbols = st_init_numtable();
14261452
arg.data = rb_hash_new();
1453+
RBASIC(arg.data)->klass = 0;
14271454
if (NIL_P(proc)) arg.proc = 0;
14281455
else arg.proc = proc;
14291456
v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
1457+
RBASIC(arg.data)->klass = rb_cHash;
14301458

14311459
return v;
14321460
}

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define RUBY_RELEASE_DATE "2008-06-15"
33
#define RUBY_VERSION_CODE 185
44
#define RUBY_RELEASE_CODE 20080615
5-
#define RUBY_PATCHLEVEL 212
5+
#define RUBY_PATCHLEVEL 213
66

77
#define RUBY_VERSION_MAJOR 1
88
#define RUBY_VERSION_MINOR 8

0 commit comments

Comments
 (0)