On Sun, Dec 17, 2017 at 07:32:51PM -0700, Todd C. Miller wrote:

> 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.

heh, was working towards almost the same diff. Looks good to me.

        -Otto

> 
>  - 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