Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

namazu-cgi-9 のエラーに関わる話



寺西です。

namazu-cgi-9 がセグメンテーションフォールトを起こす問題が以前あった
かと思いますが、当方でも再現しました。

それでいろいろ調べてみると、次の問題を発見しました。

src/rcfile.c

    char tmp[BUFSIZE];

    char *home;
    if ((home = getenv("HOME")) != NULL) {
      strncpy(tmp, home, BUFSIZE - 1);
      strncat(tmp, "/", BUFSIZE - strlen(tmp) - 1);

これは getenv("HOME") で返される文字列の長さが BUFSIZE - 1 を
超えないように strn*() を使っているわけですが、バグがありました。

getenv("HOME") で返される文字列の長さが BUFSIZE - 1 を超えた場合、
まず、strncpy() で BUFSIZE - 1 分コピーされます。
しかし、'\0' のターミネート文字がありません。
このため、次の strncat() の strlen(tmp) の値は BUFSIZE - 1 を超える
場合があります。すると、BUFSIZE - strlen(tmp) - 1 が負の数に
なります。tmp の文字列は '\0' でターミネートされていない上、
負の数字で strncat() を実行するので、strncat() を実行した時点で
メモリを破壊します。

これはかなりまずい問題ではないかと思います。

同様の処理は沢山ありそうです。
-- 
=====================================================================
寺西 忠勝(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