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

[FDclone-users:00965] Re: LOG_DIR from within archive browser causes SEGV



 しらいです。

In Message-Id <86wr5yklz5.knu@iDaemons.org>
        "Akinori MUSHA" <knu@iDaemons.org>さんwrites:
> >  もう 4 年前のことなんて忘却の彼方で、コード見ても何やって
> > んだかさっぱりな状態ではありますが、下記 patch で修正される
> > んじゃないかと思います。試して下さい。
> 
>  対応ありがとうございます。
> 
>  試しましたが、まだSEGVしてしまいます。

 落ちるか否かが表示ファイル数に依存していたようですね。その
依存性を取り除いてみました。先の patch は破棄してこちらをお
試し下さい。

---- Cut Here ----
diff -ur ../old/FD-3.00j/archive.c ./archive.c
--- ../old/FD-3.00j/archive.c	Sat Sep 25 00:00:00 2010
+++ ./archive.c	Tue Apr  3 19:34:48 2012
@@ -385,7 +385,8 @@
 	findpattern = old -> v_findpattern;
 	filepos = old -> v_filepos;
 	sorton = old -> v_sorton;
-	maxfile = 0;
+	maxfile = maxent;
+	while (maxfile > 0) filelist[--maxfile].name = NULL;
 
 #ifndef	_NOBROWSE
 	if (browselist) {
---- Cut Here ----


>  これはバグというほどではないですが、アーカイブブラウザ内で H から cd
> するとアーカイブのパス名が新しいカレントディレクトリ+アーカイブファイル
> 名へと更新され、たとえそのファイルが存在しなくてもブラウザが継続します。

 あれは shell を呼んでますからね。やろうと思えば何でもアリ
なので、何をされてもいい耐性は難しいですが、影響の大きそうな
ところだけなら対処可能だと思います。
 取り敢えず、archive browser で使用禁止の internal command
は command line 実行も禁止して、他の command も終了後に必ず
CWD を元に戻すようにしてみました。

---- Cut Here ----
diff -ur ../old/FD-3.00j/browse.c ./browse.c
--- ../old/FD-3.00j/browse.c	Sat Sep 25 00:00:00 2010
+++ ./browse.c	Tue Apr  3 20:55:35 2012
@@ -1621,6 +1621,7 @@
 {
 #ifndef	_NOARCHIVE
 	CONST char *tmp;
+	char *dupfullpath;
 #endif
 #ifndef	_NOPRECEDE
 	int dupsorton;
@@ -1759,7 +1760,11 @@
 #endif	/* !_NOWRITEFS */
 		}
 
+#ifndef	_NOARCHIVE
+		dupfullpath = (archivefile) ? Xstrdup(fullpath) : NULL;
+#endif
 		curfilename = filelist[filepos].name;
+
 		if (maxfile <= 0 && !(funcstat & FN_NOFILE)) no = FNC_NONE;
 #ifndef	_NOARCHIVE
 		else if (archivefile && !(funcstat & FN_ARCHIVE))
@@ -1794,6 +1799,11 @@
 #ifndef	_NOPRECEDE
 		if (sorton) haste = 0;
 #endif
+#ifndef	_NOARCHIVE
+		if (dupfullpath && no != FNC_CHDIR) VOID_C chdir2(dupfullpath);
+		Xfree(dupfullpath);
+#endif
+
 		if (no < FNC_NONE || no >= FNC_EFFECT) break;
 		if (no == FNC_CANCEL || no == FNC_HELPSPOT) helpbar();
 		if (no < FNC_UPDATE) {
diff -ur ../old/FD-3.00j/builtin.c ./builtin.c
--- ../old/FD-3.00j/builtin.c	Sat Sep 25 00:00:00 2010
+++ ./builtin.c	Tue Apr  3 20:08:10 2012
@@ -3289,16 +3289,21 @@
 int n, argc;
 char *CONST argv[];
 {
+	CONST char *cp;
+
 	if (dumbterm > 1) {
 		builtinerror(argv, NULL, ER_NOTDUMBTERM);
 		return(-1);
 	}
-	if (fd_restricted && (funclist[n].status & FN_RESTRICT)) {
-		VOID_C Xfprintf(Xstderr, "%s: %K\n", argv[0], RESTR_K);
-		return(RET_NOTICE);
-	}
-	if (argc > 2 || !filelist || maxfile <= 0) {
-		VOID_C Xfprintf(Xstderr, "%s: %K\n", argv[0], ILFNC_K);
+
+	cp = RESTR_K;
+	if (fd_restricted && (funclist[n].status & FN_RESTRICT)) /*EMPTY*/;
+	else if (archivefile && !(funclist[n].status & FN_ARCHIVE)) /*EMPTY*/;
+	else if (argc > 2 || !filelist || maxfile <= 0) cp = ILFNC_K;
+	else cp = NULL;
+
+	if (cp) {
+		VOID_C Xfprintf(Xstderr, "%s: %K\n", argv[0], cp);
 		return(RET_NOTICE);
 	}
 #ifdef	DEP_PTY
---- Cut Here ----


> これはブラウザを抜けてくれた方がうれしそうです。

 EXECUTE_SH で Enter のみ入力すると対話モードになりますが、
こうなると見ため shell そのものなんで一時的に cd したくなる
ことはあると思います。
 それで archive browser を抜けちゃうと一瞬意味不明になると
思うので、元の CWD に戻しておいた方が無難だと思います。cd し
たか否かを見張ってるような実装は却って面倒ですし。

 そもそも EXECUTE_SH 自体を archive browser 内で使用禁止に
した方が安全なのかも知れませんけど、それだと全く危険性のない
command まで使えなくなって利便性が落ちますからね。
 そこそこ安全でそこそこ便利な落としどころとなると、こんな感
じになるんじゃないでしょうか。

                                               しらい たかし