From 77898c33e38be4333112986f9f4f68867f8ce7ca Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 22 Jun 2012 04:32:39 +0000 Subject: error.c: rb_check_copyable * error.c (rb_check_copyable): new function, to ensure the target is not frozen and the source is not tainted nor untrusted. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36174 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ error.c | 15 +++++++++++++++ include/ruby/intern.h | 1 + 3 files changed, 21 insertions(+) diff --git a/ChangeLog b/ChangeLog index fd5e11119a..e8be6cba70 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Jun 22 13:32:33 2012 Nobuyoshi Nakada + + * error.c (rb_check_copyable): new function, to ensure the target is + not frozen and the source is not tainted nor untrusted. + Fri Jun 22 05:55:20 2012 Eric Hodel * eval.c (ruby_cleanup): Fixed typo. Patch by Trever Dawe. diff --git a/error.c b/error.c index a1987fec95..09921361cf 100644 --- a/error.c +++ b/error.c @@ -2010,6 +2010,21 @@ rb_check_trusted(VALUE obj) rb_check_trusted_internal(obj); } +void +rb_check_copyable(VALUE obj, VALUE orig) +{ + if (!FL_ABLE(obj)) return; + rb_check_frozen_internal(obj); + rb_check_trusted_internal(obj); + if (!FL_ABLE(orig)) return; + if ((~RBASIC(obj)->flags & RBASIC(orig)->flags) & (FL_UNTRUSTED|FL_TAINT)) { + if (rb_safe_level() > 0) { + rb_raise(rb_eSecurityError, "Insecure: can't modify %"PRIsVALUE, + RBASIC(obj)->klass); + } + } +} + void Init_syserr(void) { diff --git a/include/ruby/intern.h b/include/ruby/intern.h index 6389073265..e5167c6fad 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -251,6 +251,7 @@ rb_check_trusted_inline(VALUE obj) } #define rb_check_trusted(obj) rb_check_trusted_inline(obj) #endif +void rb_check_copyable(VALUE obj, VALUE orig); #define OBJ_INIT_COPY(obj, orig) \ ((obj) != (orig) && (rb_obj_init_copy((obj), (orig)), 1)) -- cgit v1.2.3