diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-06-16 07:44:16 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-06-16 07:44:16 +0000 |
commit | 8d18d5b3f9d96be4120b89ff743856021de84e5b (patch) | |
tree | 11462788f23b7764043dec021eee3a0ae8ad46c4 /string.c | |
parent | 1199a7d3d6399d44662b9a8bea5f359d1fdd40c2 (diff) | |
download | ruby-8d18d5b3f9d96be4120b89ff743856021de84e5b.tar.gz |
2000-06-16
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@760 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -1087,6 +1087,7 @@ rb_str_sub_bang(argc, argv, str) VALUE pat, repl, match; struct re_registers *regs; int iter = 0; + int tainted = 0; long plen; if (argc == 1 && rb_block_given_p()) { @@ -1094,6 +1095,7 @@ rb_str_sub_bang(argc, argv, str) } else if (argc == 2) { repl = rb_obj_as_string(argv[1]);; + if (OBJ_TAINTED(repl)) tainted = 1; } else { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc); @@ -1113,6 +1115,7 @@ rb_str_sub_bang(argc, argv, str) else { repl = rb_reg_regsub(repl, str, regs); } + if (OBJ_TAINTED(repl)) tainted = 1; plen = END(0) - BEG(0); if (RSTRING(repl)->len > plen) { REALLOC_N(RSTRING(str)->ptr, char, @@ -1127,7 +1130,8 @@ rb_str_sub_bang(argc, argv, str) RSTRING(repl)->ptr, RSTRING(repl)->len); RSTRING(str)->len += RSTRING(repl)->len - plen; RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; - OBJ_INFECT(str, repl); + if (tainted) OBJ_TAINT(str); + return str; } return Qnil; |