Module Name:    src
Committed By:   snj
Date:           Fri Jul 31 16:47:13 UTC 2015

Modified Files:
        src/usr.bin/patch [netbsd-7]: pch.c

Log Message:
Pull up following revision(s) (requested by christos in ticket #915):
        usr.bin/patch/pch.c: revision 1.28
from bitrieg:
Substitution commands might contain a newline in the replacement pattern
(escaped with a backslash before it), causing patch's understanding of
the state the ed child process is in to diverge from reality. This can
lead to patch unwillingly feeding '!' (execute shell command) lines to
ed. Finding out how to do this is left as an exercise to the reader.
XXX: pullup-7


To generate a diff of this commit:
cvs rdiff -u -r1.25.8.1 -r1.25.8.2 src/usr.bin/patch/pch.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/patch/pch.c
diff -u src/usr.bin/patch/pch.c:1.25.8.1 src/usr.bin/patch/pch.c:1.25.8.2
--- src/usr.bin/patch/pch.c:1.25.8.1	Fri Nov 28 09:09:19 2014
+++ src/usr.bin/patch/pch.c	Fri Jul 31 16:47:13 2015
@@ -1,7 +1,7 @@
 /*
  * $OpenBSD: pch.c,v 1.37 2007/09/02 15:19:33 deraadt Exp $
  * $DragonFly: src/usr.bin/patch/pch.c,v 1.6 2008/08/10 23:35:40 joerg Exp $
- * $NetBSD: pch.c,v 1.25.8.1 2014/11/28 09:09:19 martin Exp $
+ * $NetBSD: pch.c,v 1.25.8.2 2015/07/31 16:47:13 snj Exp $
  */
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pch.c,v 1.25.8.1 2014/11/28 09:09:19 martin Exp $");
+__RCSID("$NetBSD: pch.c,v 1.25.8.2 2015/07/31 16:47:13 snj Exp $");
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -1407,6 +1407,7 @@ do_ed_script(void)
 	char	*t;
 	long	beginning_of_this_line;
 	FILE	*pipefp = NULL;
+	int	continuation;
 
 	if (!skip_rest_of_patch) {
 		if (copy_file(filearg[0], TMPOUTNAME) < 0) {
@@ -1431,7 +1432,19 @@ do_ed_script(void)
 		    *t == 'd' || *t == 'i' || *t == 's')) {
 			if (pipefp != NULL)
 				fputs(buf, pipefp);
-			if (*t != 'd') {
+			if (*t == 's') {
+				for (;;) {
+					continuation = 0;
+					t = strchr(buf, '\0') - 1;
+					while (--t >= buf && *t == '\\')
+						continuation = !continuation;
+					if (!continuation ||
+					    pgets(buf, sizeof buf, pfp) == NULL)
+						break;
+					if (pipefp != NULL)
+						fputs(buf, pipefp);
+				}
+			} else if (*t != 'd') {
 				while (pgets(buf, buf_len, pfp) != NULL) {
 					p_input_line++;
 					if (pipefp != NULL)

Reply via email to