[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)



 しらいです。

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 を終了させるため
の修正です。

                                               しらい たかし