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);