From: nobu.nakada@... Date: 2001-06-18T23:01:43+09:00 Subject: [ruby-dev:13614] Re: [PATCH] $-i recycled なかだです。 At Tue, 10 Apr 2001 02:50:05 +0900, Nobuyoshi-Nakada wrote: > $-i をスクリプトで設定すると、サフィックスとしてゴミがつくこ > とがあります。ruby_inplace_mode が指している文字列が val と一緒 > に開放されてしまうようです。 すいません、これ途中で例外が上がる場合を考えてませんでした。 to_s で中断するとやっぱりゴミが残ります。 Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.69.2.9 diff -u -2 -p -r1.69.2.9 io.c --- io.c 2001/06/05 06:40:50 1.69.2.9 +++ io.c 2001/06/18 11:00:24 @@ -3347,10 +3347,14 @@ opt_i_set(val) VALUE val; { - if (ruby_inplace_mode) free(ruby_inplace_mode); + long len; if (!RTEST(val)) { + if (ruby_inplace_mode) free(ruby_inplace_mode); ruby_inplace_mode = 0; return; } - ruby_inplace_mode = strdup(STR2CSTR(val)); + STR2CSTR(val); + len = RSTRING(val)->len; + REALLOC_N(ruby_inplace_mode, char, len + 1); + ((char *)MEMCPY(ruby_inplace_mode, RSTRING(val)->ptr, char, len))[len] = '\0'; } Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.87 diff -u -2 -p -r1.87 io.c --- io.c 2001/06/05 07:19:38 1.87 +++ io.c 2001/06/18 10:58:33 @@ -3462,11 +3462,14 @@ opt_i_set(val) VALUE val; { - if (ruby_inplace_mode) free(ruby_inplace_mode); + long len; if (!RTEST(val)) { + if (ruby_inplace_mode) free(ruby_inplace_mode); ruby_inplace_mode = 0; return; } StringValue(val); - ruby_inplace_mode = strdup(RSTRING(val)->ptr); + len = RSTRING(val)->len; + REALLOC_N(ruby_inplace_mode, char, len + 1); + ((char *)MEMCPY(ruby_inplace_mode, RSTRING(val)->ptr, char, len))[len] = '\0'; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦