]> andersk Git - gssapi-openssh.git/blobdiff - openssh/scp.c
Import of OpenSSH 3.9p1
[gssapi-openssh.git] / openssh / scp.c
index 1daa2ccf7a26b54c281a479e8a5e35f22de10d2d..ef9eaa1a41146ecba1fb9a940b342402c2ce1b69 100644 (file)
@@ -71,7 +71,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: scp.c,v 1.113 2003/11/23 23:21:21 djm Exp $");
+RCSID("$OpenBSD: scp.c,v 1.117 2004/08/11 21:44:32 avsm Exp $");
 
 #include "xmalloc.h"
 #include "atomicio.h"
@@ -80,11 +80,7 @@ RCSID("$OpenBSD: scp.c,v 1.113 2003/11/23 23:21:21 djm Exp $");
 #include "misc.h"
 #include "progressmeter.h"
 
-#ifdef HAVE___PROGNAME
 extern char *__progname;
-#else
-char *__progname;
-#endif
 
 void bwlimit(int);
 
@@ -663,7 +659,7 @@ bwlimit(int amount)
 {
        static struct timeval bwstart, bwend;
        static int lamt, thresh = 16384;
-       u_int64_t wait;
+       u_int64_t waitlen;
        struct timespec ts, rm;
 
        if (!timerisset(&bwstart)) {
@@ -681,10 +677,10 @@ bwlimit(int amount)
                return;
 
        lamt *= 8;
-       wait = (double)1000000L * lamt / limit_rate;
+       waitlen = (double)1000000L * lamt / limit_rate;
 
-       bwstart.tv_sec = wait / 1000000L;
-       bwstart.tv_usec = wait % 1000000L;
+       bwstart.tv_sec = waitlen / 1000000L;
+       bwstart.tv_usec = waitlen % 1000000L;
 
        if (timercmp(&bwstart, &bwend, >)) {
                timersub(&bwstart, &bwend, &bwend);
@@ -759,6 +755,8 @@ sink(int argc, char **argv)
                        *cp++ = ch;
                } while (cp < &buf[sizeof(buf) - 1] && ch != '\n');
                *cp = 0;
+               if (verbose_mode)
+                       fprintf(stderr, "Sink: %s", buf);
 
                if (buf[0] == '\01' || buf[0] == '\02') {
                        if (iamremote == 0)
@@ -822,6 +820,10 @@ sink(int argc, char **argv)
                        size = size * 10 + (*cp++ - '0');
                if (*cp++ != ' ')
                        SCREWUP("size not delimited");
+               if ((strchr(cp, '/') != NULL) || (strcmp(cp, "..") == 0)) {
+                       run_err("error: unexpected filename: %s", cp);
+                       exit(1);
+               }
                if (targisdir) {
                        static char *namebuf;
                        static int cursize;
@@ -843,6 +845,8 @@ sink(int argc, char **argv)
                exists = stat(np, &stb) == 0;
                if (buf[0] == 'D') {
                        int mod_flag = pflag;
+                       if (!iamrecursive)
+                               SCREWUP("received directory without -r");
                        if (exists) {
                                if (!S_ISDIR(stb.st_mode)) {
                                        errno = ENOTDIR;
@@ -894,11 +898,8 @@ bad:                       run_err("%s: %s", np, strerror(errno));
                                amt = size - i;
                        count += amt;
                        do {
-                               j = read(remin, cp, amt);
-                               if (j == -1 && (errno == EINTR ||
-                                   errno == EAGAIN)) {
-                                       continue;
-                               } else if (j <= 0) {
+                               j = atomicio(read, remin, cp, amt);
+                               if (j <= 0) {
                                        run_err("%s", j ? strerror(errno) :
                                            "dropped connection");
                                        exit(1);
@@ -938,21 +939,25 @@ bad:                      run_err("%s: %s", np, strerror(errno));
                if (pflag) {
                        if (exists || omode != mode)
 #ifdef HAVE_FCHMOD
-                               if (fchmod(ofd, omode))
+                               if (fchmod(ofd, omode)) {
 #else /* HAVE_FCHMOD */
-                               if (chmod(np, omode))
+                               if (chmod(np, omode)) {
 #endif /* HAVE_FCHMOD */
                                        run_err("%s: set mode: %s",
                                            np, strerror(errno));
+                                       wrerr = DISPLAYED;
+                               }
                } else {
                        if (!exists && omode != mode)
 #ifdef HAVE_FCHMOD
-                               if (fchmod(ofd, omode & ~mask))
+                               if (fchmod(ofd, omode & ~mask)) {
 #else /* HAVE_FCHMOD */
-                               if (chmod(np, omode & ~mask))
+                               if (chmod(np, omode & ~mask)) {
 #endif /* HAVE_FCHMOD */
                                        run_err("%s: set mode: %s",
                                            np, strerror(errno));
+                                       wrerr = DISPLAYED;
+                               }
                }
                if (close(ofd) == -1) {
                        wrerr = YES;
This page took 0.036385 seconds and 4 git commands to generate.