summaryrefslogtreecommitdiff
path: root/scp.c
diff options
context:
space:
mode:
authormillert@openbsd.org <millert@openbsd.org>2017-12-18 17:28:54 +0000
committerDamien Miller <djm@mindrot.org>2017-12-19 15:21:37 +1100
commitc9e37a8725c083441dd34a8a53768aa45c3c53fe (patch)
treefeae136d5b636c163c47e35e09b3d7058e65904a /scp.c
parent04c7e28f83062dc42f2380d1bb3a6bf0190852c0 (diff)
upstream commit
Add helper function for uri handing in scp where a missing path simply means ".". Also fix exit code and add warnings when an invalid uri is encountered. OK otto@ OpenBSD-Commit-ID: 47dcf872380586dabf7fcc6e7baf5f8ad508ae1a
Diffstat (limited to 'scp.c')
-rw-r--r--scp.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/scp.c b/scp.c
index 2103a54ea..9f99709b3 100644
--- a/scp.c
+++ b/scp.c
@@ -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
609static int
610parse_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
609void 621void
610toremote(int argc, char **argv) 622toremote(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 }