On Sun, 17 Dec 2017 14:20:10 -0700, "Todd C. Miller" wrote:

> Yes, the path is supposed to be optional.  A missing path should
> be treated as ".".  The following diff fixes the crash and the exit
> value on error.  I'll cook up a better diff with warnings later;
> scp's error handling is pretty poor.

Now with warnings / error messages.

 - todd

Index: usr.bin/ssh/scp.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/scp.c,v
retrieving revision 1.193
diff -u -p -u -r1.193 scp.c
--- usr.bin/ssh/scp.c   21 Oct 2017 23:06:24 -0000      1.193
+++ usr.bin/ssh/scp.c   18 Dec 2017 02:20:36 -0000
@@ -583,6 +583,18 @@ do_times(int fd, int verb, const struct 
        return (response());
 }
 
+static int
+parse_scp_uri(const char *uri, char **userp, char **hostp, int *portp,
+     char **pathp)
+{
+       int r;
+
+       r = parse_uri("scp", uri, userp, hostp, portp, pathp);
+       if (r == 0 && *pathp == NULL)
+               *pathp = xstrdup(".");
+       return r;
+}
+
 void
 toremote(int argc, char **argv)
 {
@@ -597,27 +609,39 @@ toremote(int argc, char **argv)
        alist.list = NULL;
 
        /* Parse target */
-       r = parse_uri("scp", argv[argc - 1], &tuser, &thost, &tport, &targ);
-       if (r == -1)
-               goto out;       /* invalid URI */
+       r = parse_scp_uri(argv[argc - 1], &tuser, &thost, &tport, &targ);
+       if (r == -1) {
+               fmprintf(stderr, "%s: invalid uri\n", argv[argc - 1]);
+               ++errs;
+               goto out;
+       }
        if (r != 0) {
                if (parse_user_host_path(argv[argc - 1], &tuser, &thost,
-                   &targ) == -1)
+                   &targ) == -1) {
+                       fmprintf(stderr, "%s: invalid target\n", argv[argc - 
1]);
+                       ++errs;
                        goto out;
+               }
        }
-       if (tuser != NULL && !okname(tuser))
+       if (tuser != NULL && !okname(tuser)) {
+               ++errs;
                goto out;
+       }
 
        /* Parse source files */
        for (i = 0; i < argc - 1; i++) {
                free(suser);
                free(host);
                free(src);
-               r = parse_uri("scp", argv[i], &suser, &host, &sport, &src);
-               if (r == -1)
-                       continue;       /* invalid URI */
-               if (r != 0)
+               r = parse_scp_uri(argv[i], &suser, &host, &sport, &src);
+               if (r == -1) {
+                       fmprintf(stderr, "%s: invalid uri\n", argv[i]);
+                       ++errs;
+                       continue;
+               }
+               if (r != 0) {
                        parse_user_host_path(argv[i], &suser, &host, &src);
+               }
                if (suser != NULL && !okname(suser)) {
                        ++errs;
                        continue;
@@ -707,8 +731,9 @@ tolocal(int argc, char **argv)
                free(suser);
                free(host);
                free(src);
-               r = parse_uri("scp", argv[i], &suser, &host, &sport, &src);
+               r = parse_scp_uri(argv[i], &suser, &host, &sport, &src);
                if (r == -1) {
+                       fmprintf(stderr, "%s: invalid uri\n", argv[i]);
                        ++errs;
                        continue;
                }

Reply via email to