Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Subject field search bug when NULL character is contained (was: fieldsearch bug?)
寺西です。
TSUCHIYA Masatoshi wrote:
>
> この結果から,buf には正しい個所が入っているにも関わらず,docid を求め
> ている一時変数 i の値がおかしくなっていることが分かります.
>
> それで,このループの上部を良く見てみると,
>
> for (i = n = 0; fgets(buf, BUFSIZE - 1, fp); i++) {
> if (buf[strlen(buf) - 1] != '\n') { /* too long */
> i--;
> continue;
> }
>
> という fgets() の成功・不成功を改行文字の存在で確認している部分があり,
> これが怪しそうだと目星をつけて,break させてみました.すると,
いや、ここは BUFSIZE - 1 より長い場合の対策です。
> (gdb) p buf
> $90 = "[Mew-dist 11182] Re(2): +Backup (h\e.A\0 h\0 h\0...)\n\0..."
>
> と,NULL文字を含む文字列が buf に代入されていることがあり,この場合は
と書かれていますが、
> fgets() は成功しているにも関わらず,buf[strlen(buf) - 1] != '\n' が成
> り立ってしまうために,docid の計算が狂っているようです.
>
> なお,ここで問題になっているメールの表題は,以下のようになっています.
>
> $ egrep "^Subject:" ~/Mail/comp/emacs/mew/430 | od -t x2z
> 0000000 7553 6a62 6365 3a74 5b20 654d 2d77 6964 >Subject: [Mew-di<
> 0000020 7473 3120 3131 3238 205d 6552 3228 3a29 >st 11182] Re(2):<
> 0000040 2b20 6142 6b63 7075 2020 2020 2020 2020 > +Backup <
> 0000060 2020 2020 2020 2020 6828 2e1b 1b41 694e > (h..A.Ni<
> 0000100 6820 4e1b 2069 1b68 694e 2e2e 292e 000a > h.Ni h.Ni...)..<
> 0000117
これを見る限り、途中に NULL 文字は含まれてはいないですね。
コントロールコードが入っているだけです。
これがそのまま NMZ.field.subject に入っておれば、
buf[strlen(buf) - 1] != '\n' は成り立ちません。
コントロールコードが NULL 文字に書き換わって、NMZ.field.subject に
入ってしまっているのなら問題が起きるでしょう。
> さてそうすると,対策としては2通り考えられます.
>
> (1) 1行を読み込むことに失敗しているかどうかを判定する部分を頑健にする.
> (1.1) 末尾に添付したパッチを適用する(かえって脆弱かも)
> (1.2) fgets() の代わりに,取得された文字列数が分かる getline() 関
> 数を使う.
>
> (2) インデックス作成時にNULL文字を取り除いておく,またはエスケープして
> おく.
もう少し調べないと、何ともいえませんが、コントロールコードを削除する
のが良いかと思います。
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E