Path: sranha!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 11 Jul 91 08:31:25 Organization: Software Research Associates, Inc.,Japan Newsgroups: fj.editor.emacs Subject: 'string-match' may cause SIGSEGV on some OSes Distribution: fj  Nemacs 3.3.2 の string-match 関数は、OS によっては segmentation fault を起こすことがあります。  現在 Nemacs は内部コードの見直しが進められていて新しい版では この不具合も修正されるそうですが、半田@電総研さんと相談したところ (最後にある投稿の経緯を参照)現段階でのとりあえずの修正を投稿する こととなりました。 現象:  0 番地の内容を読み込もうとすると segmentation fault を起こす機械及び OSの組合わせ(例えば RISC-NEWS & NEWS OS 4.0 や Sparc Station 2 & Sun OS 4.1.1)において Nemacs-3.3.2 を動かし、kanji-flag が nil でない 状態で (string-match "¥¥w+" "") を評価すると、Segmentation fault を 起こして異常終了します。 原因:  原因は、regex.c の中の re_match_2(合致を実際に調べる関数)の 中での CATEGORY_SET2 というマクロの使い方にあるようです。 このマクロが評価される前には、被検査文字列を指す引数の d は まだ文字列の終端に達していないことを保証しなければなりませんが、 "¥¥w" の扱いのところなど数箇所でこの検査をやりそこなっています。 修正:  現時点でとりあえずこのバグを修正するためには、以下のパッチを regex.c にあててみてください。 ……ちょきちょき……ちょきちょき……ちょきちょき…… *** regex.c.nemacs Thu Jul 12 15:32:30 1990 --- regex.c Thu Jul 4 18:19:44 1991 *************** *** 1915,1922 **** #ifdef NEMACS /* 88.6.2, 89.9.17 by K.Handa */ case categoryspec: mcnt = *p++; - CATEGORY_SET2; PREFETCH; D_INCRE; if (ctg2 != (enum categorycode) mcnt) goto fail; break; --- 1915,1922 ---- #ifdef NEMACS /* 88.6.2, 89.9.17 by K.Handa */ case categoryspec: mcnt = *p++; PREFETCH; + CATEGORY_SET2; D_INCRE; if (ctg2 != (enum categorycode) mcnt) goto fail; break; *************** *** 1923,1930 **** case notcategoryspec: mcnt = *p++; - CATEGORY_SET2; PREFETCH; D_INCRE; if (ctg2 == (enum categorycode) mcnt) goto fail; break; --- 1923,1930 ---- case notcategoryspec: mcnt = *p++; PREFETCH; + CATEGORY_SET2; D_INCRE; if (ctg2 == (enum categorycode) mcnt) goto fail; break; *************** *** 1948,1955 **** case wordchar: #ifdef NEMACS /* 89.9.17, 89.9.20 by K.Handa */ if (bf_kanji) { - CATEGORY_SET2; PREFETCH; D_INCRE; if (CTGWORD(ctg2)) break; goto fail; --- 1948,1955 ---- case wordchar: #ifdef NEMACS /* 89.9.17, 89.9.20 by K.Handa */ if (bf_kanji) { PREFETCH; + CATEGORY_SET2; D_INCRE; if (CTGWORD(ctg2)) break; goto fail; *************** *** 1975,1982 **** case notwordchar: #ifdef NEMACS /* 89.9.17, 89.10.20 by K.Handa */ if (bf_kanji) { - CATEGORY_SET2; PREFETCH; D_INCRE; if (CTGWORD(ctg2)) goto fail; break; --- 1975,1982 ---- case notwordchar: #ifdef NEMACS /* 89.9.17, 89.10.20 by K.Handa */ if (bf_kanji) { PREFETCH; + CATEGORY_SET2; D_INCRE; if (CTGWORD(ctg2)) goto fail; break; ……ちょきちょき……ちょきちょき……ちょきちょき…… 投稿までの経緯:  これは2カ月ぐらい前から知られていた bug なのですが、最近目が醒めた 瞬間に何故かこの bug のことが思い浮かび、突然思い出した理由を通勤途上の 電車の中で考えているうちに比較的きれいなパッチが思い浮かびました。  私は思いだし笑いや思いだし悔しがりとか思いだし赤面とかが多い 人間なのですが、目覚めにコンピューターのことが思い浮かんだのは 生まれて初めてで、ショックでした。半田さんと相談したところ、 この bug のために成仏できないでいるプログラマーやプログラムが いるのではないかということになり、恐くなって投稿しました。  投稿したために呪いが network 上にばらまかれるなんてことないですよね? どなたか祈祷をしてくれる Elisp のコード等をお持ちではありませんか? -- ----____----____ 渡邊克宏 SRAソフトウェア工学研究所