[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00008] Re: case sentence (Re: Re: FDclone 2.01 has been released)
- Subject: [FDclone-users:00008] Re: case sentence (Re: Re: FDclone 2.01 has been released)
- From: Takashi SHIRAI <shirai@nintendo.co.jp>
- Date: Mon, 20 May 2002 15:54:30 +0900
しらいです。
In Message-Id <20020518091753E.kgh12351@kgh12351.nifty.ne.jp>
Taketoshi Sano <sano@debian.org>さんwrites:
> 佐野@浜松です。
> 上記のように case 文のパターン評価( ")" の前) に
> 空白で区切られた不正な構文のスクリプトを渡すと、
> キーボード入力に対する反応がまったく無くなり、
> CPU 時間を大量に消費するようになります。
単純に bug ですね。buffer underflow していました。
> なお . ではなく fdsh chk.sh のように実行した場合は
>
> # fdsh ./chk.sh
> ./chk.sh: chk): unexpected token
> #
>
> となり、反応が無くなることはありません。
これはたまたまです。memory leak 絡みの bug は必ずしも顕在
化するとは限りませんから。実際、前者の支障も他の OS では全然
平気だったりもします。
trace していくと free() で freeze していることは判ったんで
すが、free() の中のどういう処理で詰まっているのかを調べよう
として GNU malloc library を local に用意して試すと正常動作
しかしませんでした。
Linux の malloc は比較的 bug に対する耐性が弱いので、Linux
でのみ顕在化することが多いですね。
> スクリプトの構文が不正な場合でも、そのまま反応が
> 無くなってしまうのは不便なので、スクリプトの処理を
> 中止してプロンプトに戻ってくれるほうがありがたいのですが、
> いかがでしょう ?
はっきりと bug と言ってくれればいいのに...。
---- Cut Here ----
diff -u ../old/FD-2.01/system.c ./system.c
--- ../old/FD-2.01/system.c Wed May 8 00:00:00 2002
+++ ./system.c Mon May 20 14:52:10 2002
@@ -4951,7 +4951,7 @@
else addarg(&trp, tok, tptrp, typep, *nump, 0);
break;
case ';':
- if (*tptrp
+ if (*tptrp > 0
&& addarg(&trp, tok, tptrp, typep, *nump, 1) >= 0) {
int id, stype;
@@ -4988,6 +4988,10 @@
break;
#endif
case '\n':
+ if (*tptrp < 0) {
+ syntaxerrno = ER_UNEXPNL;
+ break;
+ }
if (addarg(&trp, tok, tptrp, typep, *nump, 1) < 0)
break;
i = getstatid(parentshell(trp)) + 1;
@@ -5005,7 +5009,7 @@
&& s[*ptrp + 1] != '\n') (*ptrp)++;
else if (!strchr(IFS_SET, s[*ptrp])) {
if (*tptrp < 0) syntaxerrno = ER_UNEXPTOK;
- tok[(*tptrp)++] = s[*ptrp];
+ else tok[(*tptrp)++] = s[*ptrp];
}
else if (*tptrp > 0) {
addarg(&trp, tok, tptrp, typep, *nump, 0);
@@ -5189,7 +5193,6 @@
if (!trp) {
if (tok) free(tok);
freestree(stree);
- syntaxerrno = 0;
return(NULL);
}
}
---- Cut Here ----
本件に関する bug fix は 3 つめのみで解消されますが、同様の
memory leak を防ぐために 1, 2 番目の修正を施しました。最後の
は、syntax error があった時に途中で script を終了させるため
の修正です。
しらい たかし