Avoid recursing into . and .. when in -r mode
[u/mdw/putty] / scp.c
diff --git a/scp.c b/scp.c
index 075b731..ac232fa 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -164,7 +164,7 @@ static void print_stats(char *name, unsigned long size, unsigned long done,
        eta = size - done;
     else
        eta = (unsigned long) ((size - done) / ratebs);
-    sprintf(etastr, "%02d:%02d:%02d",
+    sprintf(etastr, "%02ld:%02ld:%02ld",
            eta / 3600, (eta % 3600) / 60, eta % 60);
 
     pct = (int) (100.0 * (float) done / size);
@@ -277,10 +277,25 @@ static void source(char *src)
     }
 
     if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
-       if (recursive)
-           rsource(src);
-       else
+       if (recursive) {
+            /*
+             * Avoid . and .. directories.
+             */
+            char *p;
+            p = strrchr(src, '/');
+            if (!p)
+                p = strrchr(src, '\\');
+            if (!p)
+                p = src;
+            else
+                p++;
+            if (!strcmp(p, ".") || !strcmp(p, ".."))
+                /* skip . and .. */;
+            else
+                rsource(src);
+        } else {
            run_err("%s: not a regular file", src);
+        }
        return;
     }
 
@@ -457,7 +472,7 @@ static void sink(char *targ)
            ssh_send("", 1);
            return;
          case 'T':
-           if (sscanf(buf, "T%d %*d %d %*d",
+           if (sscanf(buf, "T%ld %*d %ld %*d",
                       &mtime, &atime) == 2) {
                settime = 1;
                ssh_send("", 1);
@@ -471,7 +486,7 @@ static void sink(char *targ)
            bump("Protocol error: Expected control record");
        }
 
-       if (sscanf(buf+1, "%u %u %[^\n]", &mode, &size, namebuf) != 3)
+       if (sscanf(buf+1, "%u %lu %[^\n]", &mode, &size, namebuf) != 3)
            bump("Protocol error: Illegal file descriptor format");
        if (targisdir) {
            char t[2048];