diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-14 15:41:40 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-14 15:41:40 +0000 |
commit | 0f36ecebe0d0e89dd96d66dba96119824ae055a0 (patch) | |
tree | b4be2daabe661ccbee038408fe0a4a4be85e9699 /string.c | |
parent | 8f1c92af4f90b4817eebcaa7c1e75747a90cfb50 (diff) | |
download | ruby-0f36ecebe0d0e89dd96d66dba96119824ae055a0.tar.gz |
* string.c (rb_str_clear): avoid revealing NULL pointer.
[ruby-dev:24766]
* string.c (str_gsub): add paranoid check. [ruby-dev:24827]
* string.c (str_mod_check): check frozen status as well.
[ruby-dev:24801]
* lib/mathn.rb (Integer::gcd2): faster implementation by
<erlercw@siu.edu>. [ruby-talk:120232]
* ext/gdbm/gdbm.c (fgdbm_store): StringValue() may alter string
pointer. [ruby-dev:24783]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7265 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -45,7 +45,7 @@ str_mod_check(s, p, len) char *p; long len; { - if (RSTRING(s)->ptr != p || RSTRING(s)->len != len) { + if (RSTRING(s)->ptr != p || RSTRING(s)->len != len || OBJ_FROZEN(s)) { rb_raise(rb_eRuntimeError, "string modified"); } } @@ -1962,9 +1962,7 @@ rb_str_sub_bang(argc, argv, str) rb_match_busy(match); repl = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); - if (RSTRING(str)->ptr != p || RSTRING(str)->len != len) { - rb_raise(rb_eRuntimeError, "string modified"); - } + str_mod_check(str, p, len); rb_backref_set(match); } else { @@ -2084,6 +2082,9 @@ str_gsub(argc, argv, str, bang) rb_match_busy(match); val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); str_mod_check(str, sp, slen); + if (val == dest) { /* paranoid chack [ruby-dev:24827] */ + rb_raise(rb_eRuntimeError, "block should not cheat"); + } rb_backref_set(match); } else { |