Module Name:    src
Committed By:   riz
Date:           Wed May  9 15:42:09 UTC 2012

Modified Files:
        src/bin/rcp [netbsd-6]: rcp.c

Log Message:
Pull up following revision(s) (requested by chs in ticket #230):
        bin/rcp/rcp.c: revision 1.49
allocate a separate buffer in each call to sink().
reusing the buffer across recursive calls just doesn't work right.


To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.48.8.1 src/bin/rcp/rcp.c

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

Modified files:

Index: src/bin/rcp/rcp.c
diff -u src/bin/rcp/rcp.c:1.48 src/bin/rcp/rcp.c:1.48.8.1
--- src/bin/rcp/rcp.c:1.48	Mon Aug 31 07:11:16 2009
+++ src/bin/rcp/rcp.c	Wed May  9 15:42:08 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rcp.c,v 1.48 2009/08/31 07:11:16 dholland Exp $	*/
+/*	$NetBSD: rcp.c,v 1.48.8.1 2012/05/09 15:42:08 riz Exp $	*/
 
 /*
  * Copyright (c) 1983, 1990, 1992, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19
 #if 0
 static char sccsid[] = "@(#)rcp.c	8.2 (Berkeley) 4/2/94";
 #else
-__RCSID("$NetBSD: rcp.c,v 1.48 2009/08/31 07:11:16 dholland Exp $");
+__RCSID("$NetBSD: rcp.c,v 1.48.8.1 2012/05/09 15:42:08 riz Exp $");
 #endif
 #endif /* not lint */
 
@@ -485,6 +485,8 @@ sink(int argc, char *argv[])
 	char ch, *cp, *np, *targ, *vect[1], buf[BUFSIZ];
 	const char *why;
 	off_t size;
+	char *namebuf = NULL;
+	size_t cursize = 0;
 
 #define	atime	tv[0]
 #define	mtime	tv[1]
@@ -507,7 +509,7 @@ sink(int argc, char *argv[])
 	for (first = 1;; first = 0) {
 		cp = buf;
 		if (read(rem, cp, 1) <= 0)
-			return;
+			goto out;
 		if (*cp++ == '\n')
 			SCREWUP("unexpected <newline>");
 		do {
@@ -528,7 +530,7 @@ sink(int argc, char *argv[])
 		}
 		if (buf[0] == 'E') {
 			(void)write(rem, "", 1);
-			return;
+			goto out;
 		}
 
 		if (ch == '\n')
@@ -582,20 +584,19 @@ sink(int argc, char *argv[])
 		if (*cp++ != ' ')
 			SCREWUP("size not delimited");
 		if (targisdir) {
-			static char *namebuf;
-			static size_t cursize;
 			char *newnamebuf;
 			size_t need;
 
-			need = strlen(targ) + strlen(cp) + 250;
+			need = strlen(targ) + strlen(cp) + 2;
 			if (need > cursize) {
+				need += 256;
 				newnamebuf = realloc(namebuf, need);
 				if (newnamebuf != NULL) {
 					namebuf = newnamebuf;
 					cursize = need;
 				} else {
-					/* note: run_err is not fatal */
 					run_err("%s", strerror(errno));
+					exit(1);
 				}
 			}
 			(void)snprintf(namebuf, cursize, "%s%s%s", targ,
@@ -726,6 +727,13 @@ bad:			run_err("%s: %s", np, strerror(er
 			break;
 		}
 	}
+
+out:
+	if (namebuf) {
+		free(namebuf);
+	}
+	return;
+
 screwup:
 	run_err("protocol error: %s", why);
 	exit(1);

Reply via email to