=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/scp.c,v retrieving revision 1.135.2.1 retrieving revision 1.136 diff -u -r1.135.2.1 -r1.136 --- src/usr.bin/ssh/scp.c 2006/09/30 04:06:51 1.135.2.1 +++ src/usr.bin/ssh/scp.c 2006/03/16 10:31:45 1.136 @@ -1,4 +1,3 @@ -/* $OpenBSD: scp.c,v 1.135.2.1 2006/09/30 04:06:51 brad Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -71,25 +70,16 @@ * */ -#include +#include "includes.h" +RCSID("$OpenBSD: scp.c,v 1.136 2006/03/16 10:31:45 biorn Exp $"); + #include #include #include -#include -#include #include #include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include #include "xmalloc.h" #include "atomicio.h" @@ -98,7 +88,7 @@ #include "misc.h" #include "progressmeter.h" -int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout); +int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc); void bwlimit(int); @@ -185,7 +175,7 @@ */ int -do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout) +do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc) { int pin[2], pout[2], reserved[2]; @@ -199,8 +189,7 @@ * Reserve two descriptors so that the real pipes won't get * descriptors 0 and 1 because that will screw up dup2 below. */ - if (pipe(reserved) < 0) - fatal("pipe: %s", strerror(errno)); + pipe(reserved); /* Create a socket pair for communicating with ssh. */ if (pipe(pin) < 0) @@ -253,6 +242,7 @@ BUF *allocbuf(BUF *, int, int); void lostconn(int); +void nospace(void); int okname(char *); void run_err(const char *,...); void verifydir(char *); @@ -276,21 +266,15 @@ int main(int argc, char **argv) { - int ch, fflag, tflag, status, n; + int ch, fflag, tflag, status; double speed; - char *targ, *endp, **newargv; + char *targ, *endp; extern char *optarg; extern int optind; /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); - /* Copy argv, because we modify it */ - newargv = xcalloc(MAX(argc + 1, 1), sizeof(*newargv)); - for (n = 0; n < argc; n++) - newargv[n] = xstrdup(argv[n]); - argv = newargv; - memset(&args, '\0', sizeof(args)); args.list = NULL; addargs(&args, "%s", ssh_program); @@ -428,9 +412,9 @@ void toremote(char *targ, int argc, char **argv) { + int i, len; char *bp, *host, *src, *suser, *thost, *tuser, *arg; arglist alist; - int i; memset(&alist, '\0', sizeof(alist)); alist.list = NULL; @@ -495,10 +479,12 @@ errs = 1; } else { /* local to remote */ if (remin == -1) { - xasprintf(&bp, "%s -t %s", cmd, targ); + len = strlen(targ) + CMDNEEDS + 20; + bp = xmalloc(len); + (void) snprintf(bp, len, "%s -t %s", cmd, targ); host = cleanhostname(thost); if (do_cmd(host, tuser, bp, &remin, - &remout) < 0) + &remout, argc) < 0) exit(1); if (response() < 0) exit(1); @@ -507,15 +493,14 @@ source(1, argv + i); } } - xfree(arg); } void tolocal(int argc, char **argv) { + int i, len; char *bp, *host, *src, *suser; arglist alist; - int i; memset(&alist, '\0', sizeof(alist)); alist.list = NULL; @@ -547,8 +532,10 @@ suser = pwd->pw_name; } host = cleanhostname(host); - xasprintf(&bp, "%s -f %s", cmd, src); - if (do_cmd(host, suser, bp, &remin, &remout) < 0) { + len = strlen(src) + CMDNEEDS + 20; + bp = xmalloc(len); + (void) snprintf(bp, len, "%s -f %s", cmd, src); + if (do_cmd(host, suser, bp, &remin, &remout, argc) < 0) { (void) xfree(bp); ++errs; continue; @@ -793,8 +780,7 @@ BUF *bp; off_t i; size_t j, count; - int amt, exists, first, ofd; - mode_t mode, omode, mask; + int amt, exists, first, mask, mode, ofd, omode; off_t size, statbytes; int setimes, targisdir, wrerrno = 0; char ch, *cp, *np, *targ, *why, *vect[1], buf[2048]; @@ -1186,7 +1172,7 @@ if (bp->buf == NULL) bp->buf = xmalloc(size); else - bp->buf = xrealloc(bp->buf, 1, size); + bp->buf = xrealloc(bp->buf, size); memset(bp->buf, 0, size); bp->cnt = size; return (bp);