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