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

[FDclone-users:00287] Escaped linefeed bug in FD-2.05e



 しらいです。

 FDclone 2.05e に以下のような bug が見つかりました。

	「\」で終わるコマンド行を正しく処理出来ない点を修正。

 EXECUTE_SH や .fd2rc など、command line 入力行の末尾に「\」
を置くと、その入力行の改行が抑制され、継続行と連結した行とし
て扱われる筈なんですが、これが単なる「\」として扱われていま
した。
 下記の patch で修正される筈ですので各自お試し下さい。今週
中にも次期 release をします。

---- Cut Here ----
diff -u ../old/FD-2.05e/pathname.c ./pathname.c
--- ../old/FD-2.05e/pathname.c	Wed Jun  9 00:00:00 2004
+++ ./pathname.c	Sun Jun 13 01:48:43 2004
@@ -141,7 +141,7 @@
 
 static char *NEAR getenvvar __P_((char *, int));
 static int NEAR setvar __P_((char *, char *, int));
-static int NEAR ismeta __P_((char *s, int, int, int));
+static int NEAR ismeta __P_((char *s, int, int, int, int));
 #ifdef	_NOORIGGLOB
 static char *NEAR cnvregexp __P_((char *, int));
 #else
@@ -820,9 +820,9 @@
 	return(s);
 }
 
-static int NEAR ismeta(s, ptr, quote, len)
+static int NEAR ismeta(s, ptr, quote, len, flags)
 char *s;
-int ptr, quote, len;
+int ptr, quote, len, flags;
 {
 #ifdef	FAKEMETA
 	return(0);
@@ -830,7 +830,7 @@
 	if (s[ptr] != PMETA || quote == '\'') return(0);
 
 	if (len >= 0) {
-		if (ptr + 1 >= len) return(0);
+		if (!(flags & EA_EOLMETA) && ptr + 1 >= len) return(0);
 # ifndef	BASHSTYLE
 	/* bash does not treat "\" as \ */
 		if (quote == '"' && s[ptr + 1] == quote && ptr + 2 >= len)
@@ -838,7 +838,7 @@
 # endif
 	}
 	else {
-		if (!s[ptr + 1]) return(0);
+		if (!(flags & EA_EOLMETA) && !s[ptr + 1]) return(0);
 # ifndef	BASHSTYLE
 	/* bash does not treat "\" as \ */
 		if (quote == '"' && s[ptr + 1] == quote && !s[ptr + 2])
@@ -884,7 +884,7 @@
 			re[j++] = s[i];
 			continue;
 		}
-		else if (ismeta(s, i, '\0', len)) {
+		else if (ismeta(s, i, '\0', len, 0)) {
 			re[j++] = s[i++];
 			re[j++] = s[i];
 		}
@@ -2183,7 +2183,7 @@
 #endif
 	else if (*qp == '\'') return(PC_SQUOTE);
 	else if (spc && *s == spc) return(*s);
-	else if (ismeta(s, 0, *qp, len)) return(PC_META);
+	else if (ismeta(s, 0, *qp, len, flags)) return(PC_META);
 #ifdef	BASHSTYLE
 	/* bash can include `...` in "..." */
 	else if ((flags & EA_BACKQ) && *s == '`') {
diff -u ../old/FD-2.05e/pathname.h ./pathname.h
--- ../old/FD-2.05e/pathname.h	Wed Jun  9 00:00:00 2004
+++ ./pathname.h	Sun Jun 13 01:47:14 2004
@@ -129,6 +129,7 @@
 #define	EA_NOEVALQ	0010
 #define	EA_STRIPQLATER	0020
 #define	EA_NOUNIQDELIM	0040
+#define	EA_EOLMETA	0100
 
 #ifdef	NOUID_T
 typedef u_short	uid_t;
diff -u ../old/FD-2.05e/system.c ./system.c
--- ../old/FD-2.05e/system.c	Wed Jun  9 00:00:00 2004
+++ ./system.c	Sun Jun 13 01:55:23 2004
@@ -5795,11 +5795,12 @@
 			}
 		}
 
-		pc = parsechar(&(s[i]), -1,
+		pc = parsechar(&(s[i]), -1, '$', EA_BACKQ | EA_EOLMETA,
 #ifdef	BASHSTYLE
-			'$', EA_BACKQ, &(rp -> new), &(rp -> old));
+	/* bash can include `...` in "..." */
+			&(rp -> new), &(rp -> old));
 #else
-			'$', EA_BACKQ, &(rp -> new), NULL);
+			&(rp -> new), NULL);
 #endif
 
 		if (pc == PC_OPQUOTE || pc == PC_CLQUOTE || pc == PC_SQUOTE)
---- Cut Here ----

                                               しらい たかし