Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/crypto/external/bsd/openssh/dist/scp.c,v rcsdiff: /ftp/cvs/cvsroot/src/crypto/external/bsd/openssh/dist/scp.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.6.4.1 retrieving revision 1.7 diff -u -p -r1.6.4.1 -r1.7 --- src/crypto/external/bsd/openssh/dist/scp.c 2017/08/15 05:27:52 1.6.4.1 +++ src/crypto/external/bsd/openssh/dist/scp.c 2012/05/02 02:41:08 1.7 @@ -1,5 +1,5 @@ -/* $NetBSD: scp.c,v 1.6.4.1 2017/08/15 05:27:52 snj Exp $ */ -/* $OpenBSD: scp.c,v 1.187 2016/09/12 01:22:38 deraadt Exp $ */ +/* $NetBSD: scp.c,v 1.7 2012/05/02 02:41:08 christos Exp $ */ +/* $OpenBSD: scp.c,v 1.171 2011/09/09 22:37:01 djm Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -73,9 +73,8 @@ */ #include "includes.h" -__RCSID("$NetBSD: scp.c,v 1.6.4.1 2017/08/15 05:27:52 snj Exp $"); - -#include /* roundup MAX */ +__RCSID("$NetBSD: scp.c,v 1.7 2012/05/02 02:41:08 christos Exp $"); +#include #include #include #include @@ -87,7 +86,6 @@ __RCSID("$NetBSD: scp.c,v 1.6.4.1 2017/0 #include #include #include -#include #include #include #include @@ -96,7 +94,6 @@ __RCSID("$NetBSD: scp.c,v 1.6.4.1 2017/0 #include #include #include -#include #include #include "xmalloc.h" @@ -105,7 +102,6 @@ __RCSID("$NetBSD: scp.c,v 1.6.4.1 2017/0 #include "log.h" #include "misc.h" #include "progressmeter.h" -#include "utf8.h" #define COPY_BUFLEN 16384 @@ -188,7 +184,7 @@ do_local_cmd(arglist *a) if (verbose_mode) { fprintf(stderr, "Executing:"); for (i = 0; i < a->num; i++) - fmprintf(stderr, " %s", a->list[i]); + fprintf(stderr, " %s", a->list[i]); fprintf(stderr, "\n"); } if ((pid = fork()) == -1) @@ -229,7 +225,7 @@ do_cmd(char *host, char *remuser, char * int pin[2], pout[2], reserved[2]; if (verbose_mode) - fmprintf(stderr, + fprintf(stderr, "Executing: program %s host %s, user %s, command %s\n", ssh_program, host, remuser ? remuser : "(unspecified)", cmd); @@ -304,7 +300,7 @@ do_cmd2(char *host, char *remuser, char int status; if (verbose_mode) - fmprintf(stderr, + fprintf(stderr, "Executing: 2nd program %s host %s, user %s, command %s\n", ssh_program, host, remuser ? remuser : "(unspecified)", cmd); @@ -344,7 +340,7 @@ typedef struct { BUF *allocbuf(BUF *, int, int); __dead static void lostconn(int); int okname(char *); -void run_err(const char *,...) __printflike(1, 2); +void run_err(const char *,...); void verifydir(char *); struct passwd *pwd; @@ -375,10 +371,8 @@ main(int argc, char **argv) /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); - setlocale(LC_CTYPE, ""); - /* Copy argv, because we modify it */ - newargv = xcalloc(MAXIMUM(argc + 1, 1), sizeof(*newargv)); + newargv = xcalloc(MAX(argc + 1, 1), sizeof(*newargv)); for (n = 0; n < argc; n++) newargv[n] = xstrdup(argv[n]); argv = newargv; @@ -478,18 +472,6 @@ main(int argc, char **argv) if (!isatty(STDOUT_FILENO)) showprogress = 0; - if (pflag) { - /* Cannot pledge: -p allows setuid/setgid files... */ - } else { -#ifdef __OpenBSD__ - if (pledge("stdio rpath wpath cpath fattr tty proc exec", - NULL) == -1) { - perror("pledge"); - exit(1); - } -#endif - } - remin = STDIN_FILENO; remout = STDOUT_FILENO; @@ -557,25 +539,7 @@ scpio(void *_cnt, size_t s) return 0; } -static int -do_times(int fd, int verb, const struct stat *sb) -{ - /* strlen(2^64) == 20; strlen(10^6) == 7 */ - char buf[(20 + 7 + 2) * 2 + 2]; - - (void)snprintf(buf, sizeof(buf), "T%llu 0 %llu 0\n", - (unsigned long long) (sb->st_mtime < 0 ? 0 : sb->st_mtime), - (unsigned long long) (sb->st_atime < 0 ? 0 : sb->st_atime)); - if (verb) { - fprintf(stderr, "File mtime %lld atime %lld\n", - (long long)sb->st_mtime, (long long)sb->st_atime); - fprintf(stderr, "Sending file timestamps: %s", buf); - } - (void) atomicio(vwrite, fd, buf, strlen(buf)); - return (response()); -} - -void +static void toremote(char *targ, int argc, char **argv) { char *bp, *host, *src, *suser, *thost, *tuser, *arg; @@ -603,7 +567,7 @@ toremote(char *targ, int argc, char **ar } if (tuser != NULL && !okname(tuser)) { - free(arg); + xfree(arg); return; } @@ -630,13 +594,13 @@ toremote(char *targ, int argc, char **ar *src == '-' ? "-- " : "", src); if (do_cmd(host, suser, bp, &remin, &remout) < 0) exit(1); - free(bp); + (void) xfree(bp); host = cleanhostname(thost); xasprintf(&bp, "%s -t %s%s", cmd, *targ == '-' ? "-- " : "", targ); if (do_cmd2(host, tuser, bp, remin, remout) < 0) exit(1); - free(bp); + (void) xfree(bp); (void) close(remin); (void) close(remout); remin = remout = -1; @@ -687,12 +651,12 @@ toremote(char *targ, int argc, char **ar exit(1); if (response() < 0) exit(1); - free(bp); + (void) xfree(bp); } source(1, argv + i); } } - free(arg); + xfree(arg); } static void @@ -736,11 +700,11 @@ tolocal(int argc, char **argv) xasprintf(&bp, "%s -f %s%s", cmd, *src == '-' ? "-- " : "", src); if (do_cmd(host, suser, bp, &remin, &remout) < 0) { - free(bp); + (void) xfree(bp); ++errs; continue; } - free(bp); + xfree(bp); sink(1, argv + argc - 1); (void) close(remin); remin = remout = -1; @@ -754,9 +718,9 @@ source(int argc, char **argv) static BUF buffer; BUF *bp; off_t i, statbytes; - size_t amt, nr; + size_t amt; int fd = -1, haderr, indx; - char *last, *name, buf[16384], encname[PATH_MAX]; + char *last, *name, buf[16384], encname[MAXPATHLEN]; int len; for (indx = 0; indx < argc; ++indx) { @@ -800,15 +764,30 @@ syserr: run_err("%s: %s", name, strerr ++last; curfile = last; if (pflag) { - if (do_times(remout, verbose_mode, &stb) < 0) + /* + * Make it compatible with possible future + * versions expecting microseconds. + */ + (void) snprintf(buf, sizeof buf, "T%lu 0 %lu 0\n", + (u_long) (stb.st_mtime < 0 ? 0 : stb.st_mtime), + (u_long) (stb.st_atime < 0 ? 0 : stb.st_atime)); + if (verbose_mode) { + fprintf(stderr, "File mtime %ld atime %ld\n", + (long)stb.st_mtime, (long)stb.st_atime); + fprintf(stderr, "Sending file timestamps: %s", + buf); + } + (void) atomicio(vwrite, remout, buf, strlen(buf)); + if (response() < 0) goto next; } #define FILEMODEMASK (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO) snprintf(buf, sizeof buf, "C%04o %lld %s\n", (u_int) (stb.st_mode & FILEMODEMASK), (long long)stb.st_size, last); - if (verbose_mode) - fmprintf(stderr, "Sending file modes: %s", buf); + if (verbose_mode) { + fprintf(stderr, "Sending file modes: %s", buf); + } (void) atomicio(vwrite, remout, buf, strlen(buf)); if (response() < 0) goto next; @@ -827,16 +806,12 @@ next: if (fd != -1) { if (i + (off_t)amt > stb.st_size) amt = stb.st_size - i; if (!haderr) { - if ((nr = atomicio(read, fd, - bp->buf, amt)) != amt) { + if (atomicio(read, fd, bp->buf, amt) != amt) haderr = errno; - memset(bp->buf + nr, 0, amt - nr); - } } /* Keep writing after error to retain sync */ if (haderr) { (void)atomicio(vwrite, remout, bp->buf, amt); - memset(bp->buf, 0, amt); continue; } if (atomicio6(vwrite, remout, bp->buf, amt, scpio, @@ -844,6 +819,8 @@ next: if (fd != -1) { haderr = errno; } unset_nonblock(remout); + if (showprogress) + stop_progress_meter(); if (fd != -1) { if (close(fd) < 0 && !haderr) @@ -855,8 +832,6 @@ next: if (fd != -1) { else run_err("%s: %s", name, strerror(haderr)); (void) response(); - if (showprogress) - stop_progress_meter(); } } @@ -865,19 +840,23 @@ rsource(char *name, struct stat *statp) { DIR *dirp; struct dirent *dp; - char *last, *vect[1], path[PATH_MAX]; + char *last, *vect[1], path[1100]; if (!(dirp = opendir(name))) { run_err("%s: %s", name, strerror(errno)); return; } last = strrchr(name, '/'); - if (last == NULL) + if (last == 0) last = name; else last++; if (pflag) { - if (do_times(remout, verbose_mode, statp) < 0) { + (void) snprintf(path, sizeof(path), "T%lu 0 %lu 0\n", + (u_long) statp->st_mtime, + (u_long) statp->st_atime); + (void) atomicio(vwrite, remout, path, strlen(path)); + if (response() < 0) { closedir(dirp); return; } @@ -885,7 +864,7 @@ rsource(char *name, struct stat *statp) (void) snprintf(path, sizeof path, "D%04o %d %.1024s\n", (u_int) (statp->st_mode & FILEMODEMASK), 0, last); if (verbose_mode) - fmprintf(stderr, "Entering directory: %s", path); + fprintf(stderr, "Entering directory: %s", path); (void) atomicio(vwrite, remout, path, strlen(path)); if (response() < 0) { closedir(dirp); @@ -923,9 +902,8 @@ sink(int argc, char **argv) int amt, exists, first, ofd; mode_t mode, omode, mask; off_t size, statbytes; - unsigned long long ull; int setimes, targisdir, wrerrno = 0; - char ch, *cp, *np, *targ, *vect[1], buf[2048], visbuf[2048]; + char ch, *cp, *np, *targ, *vect[1], buf[16384]; const char *why; struct timeval tv[2]; @@ -961,15 +939,12 @@ sink(int argc, char **argv) } while (cp < &buf[sizeof(buf) - 1] && ch != '\n'); *cp = 0; if (verbose_mode) - fmprintf(stderr, "Sink: %s", buf); + fprintf(stderr, "Sink: %s", buf); if (buf[0] == '\01' || buf[0] == '\02') { - if (iamremote == 0) { - (void) snmprintf(visbuf, sizeof(visbuf), - NULL, "%s", buf + 1); + if (iamremote == 0) (void) atomicio(vwrite, STDERR_FILENO, - visbuf, strlen(visbuf)); - } + buf + 1, strlen(buf + 1)); if (buf[0] == '\02') exit(1); ++errs; @@ -986,31 +961,17 @@ sink(int argc, char **argv) if (*cp == 'T') { setimes++; cp++; - if (!isdigit((unsigned char)*cp)) - SCREWUP("mtime.sec not present"); - ull = strtoull(cp, &cp, 10); + mtime.tv_sec = strtol(cp, &cp, 10); if (!cp || *cp++ != ' ') SCREWUP("mtime.sec not delimited"); - if ((time_t)ull < 0 || - (unsigned long long)(time_t)ull != ull) - setimes = 0; /* out of range */ - mtime.tv_sec = ull; mtime.tv_usec = strtol(cp, &cp, 10); - if (!cp || *cp++ != ' ' || mtime.tv_usec < 0 || - mtime.tv_usec > 999999) + if (!cp || *cp++ != ' ') SCREWUP("mtime.usec not delimited"); - if (!isdigit((unsigned char)*cp)) - SCREWUP("atime.sec not present"); - ull = strtoull(cp, &cp, 10); + atime.tv_sec = strtol(cp, &cp, 10); if (!cp || *cp++ != ' ') SCREWUP("atime.sec not delimited"); - if ((time_t)ull < 0 || - (unsigned long long)(time_t)ull != ull) - setimes = 0; /* out of range */ - atime.tv_sec = ull; atime.tv_usec = strtol(cp, &cp, 10); - if (!cp || *cp++ != '\0' || atime.tv_usec < 0 || - atime.tv_usec > 999999) + if (!cp || *cp++ != '\0') SCREWUP("atime.usec not delimited"); (void) atomicio(vwrite, remout, empty, 1); continue; @@ -1053,7 +1014,8 @@ sink(int argc, char **argv) need = strlen(targ) + strlen(cp) + 250; if (need > cursize) { - free(namebuf); + if (namebuf) + xfree(namebuf); namebuf = xmalloc(need); cursize = need; } @@ -1092,11 +1054,12 @@ sink(int argc, char **argv) } if (mod_flag) (void) chmod(vect[0], mode); - free(vect[0]); + if (vect[0]) + xfree(vect[0]); continue; } omode = mode; - mode |= S_IWUSR; + mode |= S_IWRITE; if ((ofd = open(np, O_WRONLY|O_CREAT, mode)) < 0) { bad: run_err("%s: %s", np, strerror(errno)); continue; @@ -1145,6 +1108,8 @@ bad: run_err("%s: %s", np, strerror(er } } unset_nonblock(remin); + if (showprogress) + stop_progress_meter(); if (count != 0 && wrerr == NO && atomicio(vwrite, ofd, bp->buf, count) != count) { wrerr = YES; @@ -1175,8 +1140,6 @@ bad: run_err("%s: %s", np, strerror(er wrerrno = errno; } (void) response(); - if (showprogress) - stop_progress_meter(); if (setimes && wrerr == NO) { setimes = 0; if (utimes(np, tv) < 0) { @@ -1204,7 +1167,7 @@ screwup: int response(void) { - char ch, *cp, resp, rbuf[2048], visbuf[2048]; + char ch, *cp, resp, rbuf[2048]; if (atomicio(read, remin, &resp, sizeof(resp)) != sizeof(resp)) lostconn(0); @@ -1224,13 +1187,8 @@ response(void) *cp++ = ch; } while (cp < &rbuf[sizeof(rbuf) - 1] && ch != '\n'); - if (!iamremote) { - cp[-1] = '\0'; - (void) snmprintf(visbuf, sizeof(visbuf), - NULL, "%s\n", rbuf); - (void) atomicio(vwrite, STDERR_FILENO, - visbuf, strlen(visbuf)); - } + if (!iamremote) + (void) atomicio(vwrite, STDERR_FILENO, rbuf, cp - rbuf); ++errs; if (resp == 1) return (-1); @@ -1268,7 +1226,7 @@ run_err(const char *fmt,...) if (!iamremote) { va_start(ap, fmt); - vfmprintf(stderr, fmt, ap); + vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); } @@ -1299,7 +1257,7 @@ okname(char *cp0) c = (int)*cp; if (c & 0200) goto bad; - if (!isalpha(c) && !isdigit((unsigned char)c)) { + if (!isalpha(c) && !isdigit(c)) { switch (c) { case '\'': case '"': @@ -1314,7 +1272,7 @@ okname(char *cp0) } while (*++cp); return (1); -bad: fmprintf(stderr, "%s: invalid user name\n", cp0); +bad: fprintf(stderr, "%s: invalid user name\n", cp0); return (0); } @@ -1328,7 +1286,7 @@ allocbuf(BUF *bp, int fd, int blksize) run_err("fstat: %s", strerror(errno)); return (0); } - size = ROUNDUP(stb.st_blksize, blksize); + size = roundup(stb.st_blksize, blksize); if (size == 0) size = blksize; if (bp->cnt >= size) @@ -1336,7 +1294,7 @@ allocbuf(BUF *bp, int fd, int blksize) if (bp->buf == NULL) bp->buf = xmalloc(size); else - bp->buf = xreallocarray(bp->buf, 1, size); + bp->buf = xrealloc(bp->buf, 1, size); memset(bp->buf, 0, size); bp->cnt = size; return (bp); @@ -1346,7 +1304,7 @@ static void lostconn(int signo) { if (!iamremote) - (void)write(STDERR_FILENO, "lost connection\n", 16); + write(STDERR_FILENO, "lost connection\n", 16); if (signo) _exit(1); else