ruby-changes:40854
From: usa <ko1@a...>
Date: Tue, 8 Dec 2015 11:52:09 +0900 (JST)
Subject: [ruby-changes:40854] usa:r52933 (ruby_2_1): merge revision(s) 52856, 52906: [Backport #11760]
usa 2015-12-08 11:51:38 +0900 (Tue, 08 Dec 2015) New Revision: 52933 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=52933 Log: merge revision(s) 52856,52906: [Backport #11760] * encoding.c (enc_m_loader): defer finding encoding object not to be infected by marshal source. [ruby-core:71793] [Bug #11760] * marshal.c (r_object0): enable compatible loader on USERDEF class. the loader function is called with the class itself, instead of an allocated object, and the loaded data. * marshal.c (compat_allocator_table): intialize compat_allocator_tbl on demand. * object.c (rb_undefined_alloc): extract from rb_obj_alloc. * marshal.c (compat_allocator_table): initialize Modified directories: branches/ruby_2_1/ Modified files: branches/ruby_2_1/ChangeLog branches/ruby_2_1/encoding.c branches/ruby_2_1/internal.h branches/ruby_2_1/marshal.c branches/ruby_2_1/object.c branches/ruby_2_1/test/ruby/test_encoding.rb branches/ruby_2_1/version.h Index: ruby_2_1/encoding.c =================================================================== --- ruby_2_1/encoding.c (revision 52932) +++ ruby_2_1/encoding.c (revision 52933) @@ -1210,6 +1210,14 @@ enc_compatible_p(VALUE klass, VALUE str1 https://github.com/ruby/ruby/blob/trunk/ruby_2_1/encoding.c#L1210 /* :nodoc: */ static VALUE +enc_s_alloc(VALUE klass) +{ + rb_undefined_alloc(klass); + return Qnil; +} + +/* :nodoc: */ +static VALUE enc_dump(int argc, VALUE *argv, VALUE self) { rb_scan_args(argc, argv, "01", 0); @@ -1220,6 +1228,13 @@ enc_dump(int argc, VALUE *argv, VALUE se https://github.com/ruby/ruby/blob/trunk/ruby_2_1/encoding.c#L1228 static VALUE enc_load(VALUE klass, VALUE str) { + return str; +} + +/* :nodoc: */ +static VALUE +enc_m_loader(VALUE klass, VALUE str) +{ return enc_find(klass, str); } @@ -1879,7 +1894,7 @@ Init_Encoding(void) https://github.com/ruby/ruby/blob/trunk/ruby_2_1/encoding.c#L1894 int i; rb_cEncoding = rb_define_class("Encoding", rb_cObject); - rb_undef_alloc_func(rb_cEncoding); + rb_define_alloc_func(rb_cEncoding, enc_s_alloc); rb_undef_method(CLASS_OF(rb_cEncoding), "new"); rb_define_method(rb_cEncoding, "to_s", enc_name, 0); rb_define_method(rb_cEncoding, "inspect", enc_inspect, 0); @@ -1911,6 +1926,8 @@ Init_Encoding(void) https://github.com/ruby/ruby/blob/trunk/ruby_2_1/encoding.c#L1926 for (i = 0; i < enc_table.count; ++i) { rb_ary_push(list, enc_new(enc_table.list[i].enc)); } + + rb_marshal_define_compat(rb_cEncoding, Qnil, NULL, enc_m_loader); } /* locale insensitive ctype functions */ Index: ruby_2_1/ChangeLog =================================================================== --- ruby_2_1/ChangeLog (revision 52932) +++ ruby_2_1/ChangeLog (revision 52933) @@ -1,3 +1,17 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_1/ChangeLog#L1 +Tue Dec 8 11:45:42 2015 Nobuyoshi Nakada <nobu@r...> + + * encoding.c (enc_m_loader): defer finding encoding object not to + be infected by marshal source. [ruby-core:71793] [Bug #11760] + + * marshal.c (r_object0): enable compatible loader on USERDEF + class. the loader function is called with the class itself, + instead of an allocated object, and the loaded data. + + * marshal.c (compat_allocator_table): initialize + compat_allocator_tbl on demand. + + * object.c (rb_undefined_alloc): extract from rb_obj_alloc. + Fri Dec 4 10:55:08 2015 Nobuyoshi Nakada <nobu@r...> * range.c (range_to_s): should be infected by the receiver. Index: ruby_2_1/object.c =================================================================== --- ruby_2_1/object.c (revision 52932) +++ ruby_2_1/object.c (revision 52933) @@ -1771,6 +1771,13 @@ rb_class_initialize(int argc, VALUE *arg https://github.com/ruby/ruby/blob/trunk/ruby_2_1/object.c#L1771 return klass; } +void +rb_undefined_alloc(VALUE klass) +{ + rb_raise(rb_eTypeError, "allocator undefined for %"PRIsVALUE, + klass); +} + /* * call-seq: * class.allocate() -> obj @@ -1807,8 +1814,7 @@ rb_obj_alloc(VALUE klass) https://github.com/ruby/ruby/blob/trunk/ruby_2_1/object.c#L1814 } allocator = rb_get_alloc_func(klass); if (!allocator) { - rb_raise(rb_eTypeError, "allocator undefined for %"PRIsVALUE, - klass); + rb_undefined_alloc(klass); } #if !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED Index: ruby_2_1/internal.h =================================================================== --- ruby_2_1/internal.h (revision 52932) +++ ruby_2_1/internal.h (revision 52933) @@ -599,6 +599,7 @@ rb_float_new_inline(double d) https://github.com/ruby/ruby/blob/trunk/ruby_2_1/internal.h#L599 void rb_obj_copy_ivar(VALUE dest, VALUE obj); VALUE rb_obj_equal(VALUE obj1, VALUE obj2); VALUE rb_class_search_ancestor(VALUE klass, VALUE super); +NORETURN(void rb_undefined_alloc(VALUE klass)); struct RBasicRaw { VALUE flags; Index: ruby_2_1/version.h =================================================================== --- ruby_2_1/version.h (revision 52932) +++ ruby_2_1/version.h (revision 52933) @@ -1,10 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_1/version.h#L1 #define RUBY_VERSION "2.1.8" -#define RUBY_RELEASE_DATE "2015-12-04" -#define RUBY_PATCHLEVEL 432 +#define RUBY_RELEASE_DATE "2015-12-08" +#define RUBY_PATCHLEVEL 433 #define RUBY_RELEASE_YEAR 2015 #define RUBY_RELEASE_MONTH 12 -#define RUBY_RELEASE_DAY 4 +#define RUBY_RELEASE_DAY 8 #include "ruby/version.h" Index: ruby_2_1/marshal.c =================================================================== --- ruby_2_1/marshal.c (revision 52932) +++ ruby_2_1/marshal.c (revision 52933) @@ -109,6 +109,8 @@ mark_marshal_compat_t(void *tbl) https://github.com/ruby/ruby/blob/trunk/ruby_2_1/marshal.c#L109 st_foreach(tbl, mark_marshal_compat_i, 0); } +static st_table *compat_allocator_table(void); + void rb_marshal_define_compat(VALUE newclass, VALUE oldclass, VALUE (*dumper)(VALUE), VALUE (*loader)(VALUE, VALUE)) { @@ -127,7 +129,7 @@ rb_marshal_define_compat(VALUE newclass, https://github.com/ruby/ruby/blob/trunk/ruby_2_1/marshal.c#L129 compat->dumper = dumper; compat->loader = loader; - st_insert(compat_allocator_tbl, (st_data_t)allocator, (st_data_t)compat); + st_insert(compat_allocator_table(), (st_data_t)allocator, (st_data_t)compat); } #define MARSHAL_INFECTION FL_TAINT @@ -1753,6 +1755,7 @@ r_object0(struct load_arg *arg, int *ivp https://github.com/ruby/ruby/blob/trunk/ruby_2_1/marshal.c#L1755 { VALUE klass = path2class(r_unique(arg)); VALUE data; + st_data_t d; if (!rb_obj_respond_to(klass, s_load, TRUE)) { rb_raise(rb_eTypeError, "class %s needs to have method `_load'", @@ -1766,7 +1769,11 @@ r_object0(struct load_arg *arg, int *ivp https://github.com/ruby/ruby/blob/trunk/ruby_2_1/marshal.c#L1769 v = rb_funcall2(klass, s_load, 1, &data); check_load_arg(arg, s_load); v = r_entry(v, arg); - v = r_leave(v, arg); + if (st_lookup(compat_allocator_tbl, (st_data_t)rb_get_alloc_func(klass), &d)) { + marshal_compat_t *compat = (marshal_compat_t*)d; + v = compat->loader(klass, v); + } + v = r_post_proc(v, arg); } break; @@ -2128,11 +2135,17 @@ Init_marshal(void) https://github.com/ruby/ruby/blob/trunk/ruby_2_1/marshal.c#L2135 rb_define_const(rb_mMarshal, "MAJOR_VERSION", INT2FIX(MARSHAL_MAJOR)); /* minor version */ rb_define_const(rb_mMarshal, "MINOR_VERSION", INT2FIX(MARSHAL_MINOR)); +} +static st_table * +compat_allocator_table(void) +{ + if (compat_allocator_tbl) return compat_allocator_tbl; compat_allocator_tbl = st_init_numtable(); compat_allocator_tbl_wrapper = Data_Wrap_Struct(rb_cData, mark_marshal_compat_t, 0, compat_allocator_tbl); rb_gc_register_mark_object(compat_allocator_tbl_wrapper); + return compat_allocator_tbl; } VALUE Index: ruby_2_1/test/ruby/test_encoding.rb =================================================================== --- ruby_2_1/test/ruby/test_encoding.rb (revision 52932) +++ ruby_2_1/test/ruby/test_encoding.rb (revision 52933) @@ -34,6 +34,9 @@ class TestEncoding < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/ruby_2_1/test/ruby/test_encoding.rb#L34 assert_raise(TypeError) { e.dup } assert_raise(TypeError) { e.clone } assert_equal(e.object_id, Marshal.load(Marshal.dump(e)).object_id) + assert_not_predicate(e, :tainted?) + Marshal.load(Marshal.dump(e).taint) + assert_not_predicate(e, :tainted?, '[ruby-core:71793] [Bug #11760]') end end Property changes on: ruby_2_1 ___________________________________________________________________ Modified: svn:mergeinfo Merged /trunk:r52856,52906 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/