[ruby-dev:3509] [BUG] 1.1c5 gsub!() Segmentation Fault

From: 新井 康司 <JCA02266@...>
Date: 1998-09-12 16:18:48 UTC
List: ruby-dev #3509
新井です。

ruby-1.1c4 1.1c5 において、gsub!()メソッドで
Segmentation Faultしたり、ゴミの値で置換することが
あります。
再現スクリプトが複雑で大きいので、解析結果だけ報告
します。

落ちるのは、以下の regex.c: 2783 行目で、変数 p が
stringを越えた位置を指していました。

2694 int
2695 re_search(bufp, string, size, startpos, range, regs)
2696      struct re_pattern_buffer *bufp;
2697      char *string;
2698      int size, startpos, range;
2699      struct re_registers *regs;
2700 {
〜略〜
2780               p = (unsigned char *)string+startpos;
2781
2782               while (range > 0) {
2783                 c = *p++;
2784                 if (ismbchar(c)) {
2785                   if (fastmap[c])
2786                     break;
2787                   c = *p++;
2788                   range--;

このとき、startpos は、string の最後あたりを指して
いました(おそらく正しい値)。

したがって、変数 p が不正位置を指すのは変数 range 
と startpos の変更の動機が取れていないのだろうと予
測し

--- regex.c.org Fri Sep  4 16:23:12 1998
+++ regex.c     Sat Sep 12 21:21:26 1998
@@ -2758,6 +2758,7 @@
     if (pos == -1) return -1;
     if (bufp->options & RE_OPTIMIZE_EXACTN) {
       startpos += pos;
+      range -= pos;
     }
   }

このパッチを当ててみたところ再現しなくなりました。

ざっとソースを眺めて、修正をしてますので勘違いがあ
るかもしれません。まつもとさん、検証お願いします。

In This Thread

Prev Next