[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;
}
}
このパッチを当ててみたところ再現しなくなりました。
ざっとソースを眺めて、修正をしてますので勘違いがあ
るかもしれません。まつもとさん、検証お願いします。