Apply improved WinSock error handling to the few situations it still
[u/mdw/putty] / scp.c
diff --git a/scp.c b/scp.c
index 3f85006..77dd7da 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -299,8 +299,8 @@ void from_backend(int is_stderr, char *data, int datalen) {
     if (len > 0) {
         if (pendsize < pendlen + len) {
             pendsize = pendlen + len + 4096;
-            pending = (pending ? realloc(pending, pendsize) :
-                       malloc(pendsize));
+            pending = (pending ? srealloc(pending, pendsize) :
+                       smalloc(pendsize));
             if (!pending)
                 fatalbox("Out of memory");
         }
@@ -327,7 +327,7 @@ static int ssh_scp_recv(unsigned char *buf, int len) {
         pendlen -= pendused;
         if (pendlen == 0) {
             pendsize = 0;
-            free(pending);
+            sfree(pending);
             pending = NULL;
         }
         if (outlen == 0)
@@ -1003,6 +1003,27 @@ static void toremote(int argc, char *argv[])
        do {
            char *last;
            char namebuf[2048];
+           /*
+            * Ensure that . and .. are never matched by wildcards,
+            * but only by deliberate action.
+            */
+           if (!strcmp(fdat.cFileName, ".") ||
+               !strcmp(fdat.cFileName, "..")) {
+               /*
+                * Find*File has returned a special dir. We require
+                * that _either_ `src' ends in a backslash followed
+                * by that string, _or_ `src' is precisely that
+                * string.
+                */
+               int len = strlen(src), dlen = strlen(fdat.cFileName);
+               if (len == dlen && !strcmp(src, fdat.cFileName)) {
+                   /* ok */;
+               } else if (len > dlen+1 && src[len-dlen-1] == '\\' &&
+                          !strcmp(src+len-dlen, fdat.cFileName)) {
+                   /* ok */;
+               } else
+                   continue;          /* ignore this one */
+           }
            if (strlen(src) + strlen(fdat.cFileName) >=
                sizeof(namebuf)) {
                tell_user(stderr, "%s: Name too long", src);