diff options
-rw-r--r-- | scp.c | 47 |
1 files changed, 36 insertions, 11 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: scp.c,v 1.193 2017/10/21 23:06:24 millert Exp $ */ | 1 | /* $OpenBSD: scp.c,v 1.194 2017/12/18 17:28:54 millert Exp $ */ |
2 | /* | 2 | /* |
3 | * scp - secure remote copy. This is basically patched BSD rcp which | 3 | * scp - secure remote copy. This is basically patched BSD rcp which |
4 | * uses ssh to do the data transfer (instead of using rcmd). | 4 | * uses ssh to do the data transfer (instead of using rcmd). |
@@ -606,6 +606,18 @@ do_times(int fd, int verb, const struct stat *sb) | |||
606 | return (response()); | 606 | return (response()); |
607 | } | 607 | } |
608 | 608 | ||
609 | static int | ||
610 | parse_scp_uri(const char *uri, char **userp, char **hostp, int *portp, | ||
611 | char **pathp) | ||
612 | { | ||
613 | int r; | ||
614 | |||
615 | r = parse_uri("scp", uri, userp, hostp, portp, pathp); | ||
616 | if (r == 0 && *pathp == NULL) | ||
617 | *pathp = xstrdup("."); | ||
618 | return r; | ||
619 | } | ||
620 | |||
609 | void | 621 | void |
610 | toremote(int argc, char **argv) | 622 | toremote(int argc, char **argv) |
611 | { | 623 | { |
@@ -620,27 +632,39 @@ toremote(int argc, char **argv) | |||
620 | alist.list = NULL; | 632 | alist.list = NULL; |
621 | 633 | ||
622 | /* Parse target */ | 634 | /* Parse target */ |
623 | r = parse_uri("scp", argv[argc - 1], &tuser, &thost, &tport, &targ); | 635 | r = parse_scp_uri(argv[argc - 1], &tuser, &thost, &tport, &targ); |
624 | if (r == -1) | 636 | if (r == -1) { |
625 | goto out; /* invalid URI */ | 637 | fmprintf(stderr, "%s: invalid uri\n", argv[argc - 1]); |
638 | ++errs; | ||
639 | goto out; | ||
640 | } | ||
626 | if (r != 0) { | 641 | if (r != 0) { |
627 | if (parse_user_host_path(argv[argc - 1], &tuser, &thost, | 642 | if (parse_user_host_path(argv[argc - 1], &tuser, &thost, |
628 | &targ) == -1) | 643 | &targ) == -1) { |
644 | fmprintf(stderr, "%s: invalid target\n", argv[argc - 1]); | ||
645 | ++errs; | ||
629 | goto out; | 646 | goto out; |
647 | } | ||
630 | } | 648 | } |
631 | if (tuser != NULL && !okname(tuser)) | 649 | if (tuser != NULL && !okname(tuser)) { |
650 | ++errs; | ||
632 | goto out; | 651 | goto out; |
652 | } | ||
633 | 653 | ||
634 | /* Parse source files */ | 654 | /* Parse source files */ |
635 | for (i = 0; i < argc - 1; i++) { | 655 | for (i = 0; i < argc - 1; i++) { |
636 | free(suser); | 656 | free(suser); |
637 | free(host); | 657 | free(host); |
638 | free(src); | 658 | free(src); |
639 | r = parse_uri("scp", argv[i], &suser, &host, &sport, &src); | 659 | r = parse_scp_uri(argv[i], &suser, &host, &sport, &src); |
640 | if (r == -1) | 660 | if (r == -1) { |
641 | continue; /* invalid URI */ | 661 | fmprintf(stderr, "%s: invalid uri\n", argv[i]); |
642 | if (r != 0) | 662 | ++errs; |
663 | continue; | ||
664 | } | ||
665 | if (r != 0) { | ||
643 | parse_user_host_path(argv[i], &suser, &host, &src); | 666 | parse_user_host_path(argv[i], &suser, &host, &src); |
667 | } | ||
644 | if (suser != NULL && !okname(suser)) { | 668 | if (suser != NULL && !okname(suser)) { |
645 | ++errs; | 669 | ++errs; |
646 | continue; | 670 | continue; |
@@ -730,8 +754,9 @@ tolocal(int argc, char **argv) | |||
730 | free(suser); | 754 | free(suser); |
731 | free(host); | 755 | free(host); |
732 | free(src); | 756 | free(src); |
733 | r = parse_uri("scp", argv[i], &suser, &host, &sport, &src); | 757 | r = parse_scp_uri(argv[i], &suser, &host, &sport, &src); |
734 | if (r == -1) { | 758 | if (r == -1) { |
759 | fmprintf(stderr, "%s: invalid uri\n", argv[i]); | ||
735 | ++errs; | 760 | ++errs; |
736 | continue; | 761 | continue; |
737 | } | 762 | } |