1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* array.c, gc.c, hash.c, object.c, string.c, struct.c,

transcode.c, variable.c, vm.c, vm_insnhelper.c, vm_method.c:
  replace calls to rb_error_frozen() with rb_check_frozen().  a
  patch from Run Paint Run Run at [ruby-core:32014]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29583 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2010-10-24 08:14:05 +00:00
parent 58d3597e74
commit 23e8deaf0d
12 changed files with 29 additions and 58 deletions

View file

@ -1,4 +1,9 @@
Sun Oct 24 17:05:51 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> Sun Oct 24 17:14:00 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* array.c, gc.c, hash.c, object.c, string.c, struct.c,
transcode.c, variable.c, vm.c, vm_insnhelper.c, vm_method.c:
replace calls to rb_error_frozen() with rb_check_frozen(). a
patch from Run Paint Run Run at [ruby-core:32014]
* include/ruby/intern.h (rb_check_frozen): optimize. * include/ruby/intern.h (rb_check_frozen): optimize.
[ruby-core:32878] [ruby-core:32878]

View file

@ -242,7 +242,7 @@ rb_ary_set_shared(VALUE ary, VALUE shared)
static inline void static inline void
rb_ary_modify_check(VALUE ary) rb_ary_modify_check(VALUE ary)
{ {
if (OBJ_FROZEN(ary)) rb_error_frozen("array"); rb_check_frozen(ary);
if (!OBJ_UNTRUSTED(ary) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(ary) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify array"); rb_raise(rb_eSecurityError, "Insecure: can't modify array");
} }

4
gc.c
View file

@ -2722,7 +2722,7 @@ static VALUE
undefine_final(VALUE os, VALUE obj) undefine_final(VALUE os, VALUE obj)
{ {
rb_objspace_t *objspace = &rb_objspace; rb_objspace_t *objspace = &rb_objspace;
if (OBJ_FROZEN(obj)) rb_error_frozen("object"); rb_check_frozen(obj);
if (finalizer_table) { if (finalizer_table) {
st_data_t data = obj; st_data_t data = obj;
st_delete(finalizer_table, &data, 0); st_delete(finalizer_table, &data, 0);
@ -2748,7 +2748,7 @@ define_final(int argc, VALUE *argv, VALUE os)
st_data_t data; st_data_t data;
rb_scan_args(argc, argv, "11", &obj, &block); rb_scan_args(argc, argv, "11", &obj, &block);
if (OBJ_FROZEN(obj)) rb_error_frozen("object"); rb_check_frozen(obj);
if (argc == 1) { if (argc == 1) {
block = rb_block_proc(); block = rb_block_proc();
} }

2
hash.c
View file

@ -248,7 +248,7 @@ rb_hash_dup(VALUE hash)
static void static void
rb_hash_modify_check(VALUE hash) rb_hash_modify_check(VALUE hash)
{ {
if (OBJ_FROZEN(hash)) rb_error_frozen("hash"); rb_check_frozen(hash);
if (!OBJ_UNTRUSTED(hash) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(hash) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify hash"); rb_raise(rb_eSecurityError, "Insecure: can't modify hash");
} }

View file

@ -712,9 +712,7 @@ rb_obj_taint(VALUE obj)
{ {
rb_secure(4); rb_secure(4);
if (!OBJ_TAINTED(obj)) { if (!OBJ_TAINTED(obj)) {
if (OBJ_FROZEN(obj)) { rb_check_frozen(obj);
rb_error_frozen("object");
}
OBJ_TAINT(obj); OBJ_TAINT(obj);
} }
return obj; return obj;
@ -733,9 +731,7 @@ rb_obj_untaint(VALUE obj)
{ {
rb_secure(3); rb_secure(3);
if (OBJ_TAINTED(obj)) { if (OBJ_TAINTED(obj)) {
if (OBJ_FROZEN(obj)) { rb_check_frozen(obj);
rb_error_frozen("object");
}
FL_UNSET(obj, FL_TAINT); FL_UNSET(obj, FL_TAINT);
} }
return obj; return obj;
@ -768,9 +764,7 @@ rb_obj_untrust(VALUE obj)
{ {
rb_secure(4); rb_secure(4);
if (!OBJ_UNTRUSTED(obj)) { if (!OBJ_UNTRUSTED(obj)) {
if (OBJ_FROZEN(obj)) { rb_check_frozen(obj);
rb_error_frozen("object");
}
OBJ_UNTRUST(obj); OBJ_UNTRUST(obj);
} }
return obj; return obj;
@ -789,9 +783,7 @@ rb_obj_trust(VALUE obj)
{ {
rb_secure(3); rb_secure(3);
if (OBJ_UNTRUSTED(obj)) { if (OBJ_UNTRUSTED(obj)) {
if (OBJ_FROZEN(obj)) { rb_check_frozen(obj);
rb_error_frozen("object");
}
FL_UNSET(obj, FL_UNTRUSTED); FL_UNSET(obj, FL_UNTRUSTED);
} }
return obj; return obj;

View file

@ -350,14 +350,6 @@ str_mod_check(VALUE s, const char *p, long len)
} }
} }
static inline void
str_frozen_check(VALUE s)
{
if (OBJ_FROZEN(s)) {
rb_raise(rb_eRuntimeError, "string frozen");
}
}
size_t size_t
rb_str_capacity(VALUE str) rb_str_capacity(VALUE str)
{ {
@ -1250,7 +1242,7 @@ str_modifiable(VALUE str)
if (FL_TEST(str, STR_TMPLOCK)) { if (FL_TEST(str, STR_TMPLOCK)) {
rb_raise(rb_eRuntimeError, "can't modify string; temporarily locked"); rb_raise(rb_eRuntimeError, "can't modify string; temporarily locked");
} }
if (OBJ_FROZEN(str)) rb_error_frozen("string"); rb_check_frozen(str);
if (!OBJ_UNTRUSTED(str) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(str) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify string"); rb_raise(rb_eSecurityError, "Insecure: can't modify string");
} }
@ -1335,7 +1327,7 @@ void
rb_str_associate(VALUE str, VALUE add) rb_str_associate(VALUE str, VALUE add)
{ {
/* sanity check */ /* sanity check */
if (OBJ_FROZEN(str)) rb_error_frozen("string"); rb_check_frozen(str);
if (STR_ASSOC_P(str)) { if (STR_ASSOC_P(str)) {
/* already associated */ /* already associated */
rb_ary_concat(RSTRING(str)->as.heap.aux.shared, add); rb_ary_concat(RSTRING(str)->as.heap.aux.shared, add);
@ -3546,7 +3538,7 @@ rb_str_sub_bang(int argc, VALUE *argv, VALUE str)
repl = rb_obj_as_string(repl); repl = rb_obj_as_string(repl);
} }
str_mod_check(str, p, len); str_mod_check(str, p, len);
str_frozen_check(str); rb_check_frozen(str);
} }
else { else {
repl = rb_reg_regsub(repl, str, regs, pat); repl = rb_reg_regsub(repl, str, regs, pat);

View file

@ -151,7 +151,7 @@ static VALUE (*const ref_func[])(VALUE) = {
static void static void
rb_struct_modify(VALUE s) rb_struct_modify(VALUE s)
{ {
if (OBJ_FROZEN(s)) rb_error_frozen("Struct"); rb_check_frozen(s);
if (!OBJ_UNTRUSTED(s) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(s) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify Struct"); rb_raise(rb_eSecurityError, "Insecure: can't modify Struct");
} }

View file

@ -2711,9 +2711,7 @@ str_encode_bang(int argc, VALUE *argv, VALUE str)
VALUE newstr; VALUE newstr;
int encidx; int encidx;
if (OBJ_FROZEN(str)) { /* in future, may use str_frozen_check from string.c, but that's currently static */ rb_check_frozen(str);
rb_raise(rb_eRuntimeError, "string frozen");
}
newstr = str; newstr = str;
encidx = str_transcode(argc, argv, &newstr); encidx = str_transcode(argc, argv, &newstr);

View file

@ -1043,7 +1043,7 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable");
if (OBJ_FROZEN(obj)) rb_error_frozen("object"); rb_check_frozen(obj);
switch (TYPE(obj)) { switch (TYPE(obj)) {
case T_OBJECT: case T_OBJECT:
iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj); iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
@ -1305,7 +1305,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable");
if (OBJ_FROZEN(obj)) rb_error_frozen("object"); rb_check_frozen(obj);
if (!rb_is_instance_id(id)) { if (!rb_is_instance_id(id)) {
rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id)); rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id));
} }
@ -1653,8 +1653,7 @@ rb_const_remove(VALUE mod, ID id)
if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't remove constant"); rb_raise(rb_eSecurityError, "Insecure: can't remove constant");
if (OBJ_FROZEN(mod)) rb_error_frozen("class/module"); rb_check_frozen(mod);
if (!RCLASS_IV_TBL(mod) || !st_delete(RCLASS_IV_TBL(mod), &n, &v)) { if (!RCLASS_IV_TBL(mod) || !st_delete(RCLASS_IV_TBL(mod), &n, &v)) {
if (rb_const_defined_at(mod, id)) { if (rb_const_defined_at(mod, id)) {
rb_name_error(id, "cannot remove %s::%s", rb_name_error(id, "cannot remove %s::%s",
@ -1819,14 +1818,7 @@ mod_av_set(VALUE klass, ID id, VALUE val, int isconst)
if (!OBJ_UNTRUSTED(klass) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(klass) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest); rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest);
if (OBJ_FROZEN(klass)) { rb_check_frozen(klass);
if (BUILTIN_TYPE(klass) == T_MODULE) {
rb_error_frozen("module");
}
else {
rb_error_frozen("class");
}
}
if (!RCLASS_IV_TBL(klass)) { if (!RCLASS_IV_TBL(klass)) {
RCLASS_IV_TBL(klass) = st_init_numtable(); RCLASS_IV_TBL(klass) = st_init_numtable();
} }
@ -2075,8 +2067,7 @@ rb_mod_remove_cvar(VALUE mod, VALUE name)
} }
if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4) if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't remove class variable"); rb_raise(rb_eSecurityError, "Insecure: can't remove class variable");
if (OBJ_FROZEN(mod)) rb_error_frozen("class/module"); rb_check_frozen(mod);
if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), &n, &val)) { if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), &n, &val)) {
return (VALUE)val; return (VALUE)val;
} }

5
vm.c
View file

@ -1858,10 +1858,7 @@ vm_define_method(rb_thread_t *th, VALUE obj, ID id, VALUE iseqval,
rb_id2name(id), rb_obj_classname(obj)); rb_id2name(id), rb_obj_classname(obj));
} }
if (OBJ_FROZEN(obj)) { rb_check_frozen(obj);
rb_error_frozen("object");
}
klass = rb_singleton_class(obj); klass = rb_singleton_class(obj);
noex = NOEX_PUBLIC; noex = NOEX_PUBLIC;
} }

View file

@ -1298,9 +1298,8 @@ vm_setivar(VALUE obj, ID id, VALUE val, IC ic)
if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4) { if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4) {
rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable");
} }
if (OBJ_FROZEN(obj)) {
rb_error_frozen("object"); rb_check_frozen(obj);
}
if (TYPE(obj) == T_OBJECT) { if (TYPE(obj) == T_OBJECT) {
VALUE klass = RBASIC(obj)->klass; VALUE klass = RBASIC(obj)->klass;

View file

@ -211,10 +211,8 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
rb_class2name(rb_ivar_get(klass, attached))); rb_class2name(rb_ivar_get(klass, attached)));
mid = ID_ALLOCATOR; mid = ID_ALLOCATOR;
} }
if (OBJ_FROZEN(klass)) {
rb_error_frozen("class/module");
}
rb_check_frozen(klass);
mtbl = RCLASS_M_TBL(klass); mtbl = RCLASS_M_TBL(klass);
/* check re-definition */ /* check re-definition */
@ -463,8 +461,7 @@ remove_method(VALUE klass, ID mid)
if (rb_safe_level() >= 4 && !OBJ_UNTRUSTED(klass)) { if (rb_safe_level() >= 4 && !OBJ_UNTRUSTED(klass)) {
rb_raise(rb_eSecurityError, "Insecure: can't remove method"); rb_raise(rb_eSecurityError, "Insecure: can't remove method");
} }
if (OBJ_FROZEN(klass)) rb_check_frozen(klass);
rb_error_frozen("class/module");
if (mid == object_id || mid == id__send__ || mid == idInitialize) { if (mid == object_id || mid == id__send__ || mid == idInitialize) {
rb_warn("removing `%s' may cause serious problems", rb_id2name(mid)); rb_warn("removing `%s' may cause serious problems", rb_id2name(mid));
} }