[hackers] [sbase][PATCH 3/3] ed: Fix error introduced in b19d708

From: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
Date: Fri, 1 Jan 2016 17:40:34 +0100

This patch introduced init() function, which removed the initialization
code of savfname in doread, but this is incorrect, because savfname
can be initialized with a r command if savfname is empty.
---
 ed.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/ed.c b/ed.c
index 5369d60..1ecd0d9 100644
--- a/ed.c
+++ b/ed.c
_AT_@ -702,7 +702,7 @@ chkprint(int flag)
 }
 
 static char *
-getfname(void)
+getfname(char comm)
 {
 	int c;
 	char *bp;
_AT_@ -721,6 +721,8 @@ getfname(void)
 		error("file name too long");
 	} else {
 		*bp = '\0';
+		if (savfname[0] == '\0' || comm == 'e' || comm == 'f')
+			strcpy(savfname, fname);
 		return fname;
 	}
 	return NULL; /* not reached */
_AT_@ -1015,7 +1017,7 @@ subst(int nth)
 static void
 docmd(void)
 {
-	char *s, cmd;
+	char cmd;
 	int rep = 0, c, line3, num, trunc;
 
 repeat:
_AT_@ -1073,13 +1075,13 @@ repeat:
 		trunc = 1;
 	case 'W':
 		deflines(nextln(0), lastln);
-		dowrite(getfname(), trunc);
+		dowrite(getfname(cmd), trunc);
 		break;
 	case 'r':
 		if (nlines > 1)
 			goto bad_address;
 		deflines(lastln, lastln);
-		doread(getfname());
+		doread(getfname(cmd));
 		break;
 	case 'd':
 		chkprint(1);
_AT_@ -1190,10 +1192,11 @@ repeat:
 	case 'f':
 		if (nlines > 0)
 			goto unexpected;
-		if (!strcmp(s = getfname(), savfname))
-			puts(savfname);
+		if (back(input()) != '\n')
+			getfname(cmd);
 		else
-			strcpy(savfname, s);
+			puts(savfname);
+		chkprint(0);
 		break;
 	case 'E':
 		modflag = 0;
_AT_@ -1202,7 +1205,7 @@ repeat:
 			goto unexpected;
 		if (modflag)
 			goto modified;
-		strcpy(savfname, getfname());
+		getfname(cmd);
 		setscratch();
 		deflines(curln, curln);
 		doread(savfname);
-- 
2.1.4
Received on Fri Jan 01 2016 - 17:40:34 CET

This archive was generated by hypermail 2.3.0 : Fri Jan 01 2016 - 17:48:23 CET