[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00965] Re: LOG_DIR from within archive browser causes SEGV
- Subject: [FDclone-users:00965] Re: LOG_DIR from within archive browser causes SEGV
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Tue, 03 Apr 2012 21:28:07 +0900
しらいです。
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 まで使えなくなって利便性が落ちますからね。
そこそこ安全でそこそこ便利な落としどころとなると、こんな感
じになるんじゃないでしょうか。
しらい たかし