Bugzilla – Attachment 971 Details for
Bug 1094
Local to local copy (and also remote to remote) uses shell expansion twice
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Proposed patch
openssh-4.2p1-scp-no-system.patch (text/plain), 4.37 KB, created by
Tomas Mraz
on 2005-09-29 17:44:15 AEST
(
hide
)
Description:
Proposed patch
Filename:
MIME Type:
Creator:
Tomas Mraz
Created:
2005-09-29 17:44:15 AEST
Size:
4.37 KB
patch
obsolete
>--- openssh-4.2p1/scp.c.no-system 2005-09-06 15:27:10.000000000 +0200 >+++ openssh-4.2p1/scp.c 2005-09-28 21:58:07.000000000 +0200 >@@ -185,6 +185,46 @@ > return 0; > } > >+int >+do_spawnwait(arglist *alist) >+{ >+ int status; >+ >+ if (verbose_mode) { >+ int i; >+ >+ fprintf(stderr, "Executing:"); >+ for (i = 0; alist->list[i] != NULL; i++) { >+ fprintf(stderr, " %s", alist->list[i]); >+ } >+ fprintf(stderr, "\n"); >+ } >+ /* Fork a child to execute the command. */ >+ do_cmd_pid = fork(); >+ if (do_cmd_pid == 0) { >+ /* Child. */ >+ >+ execvp(alist->list[0], alist->list); >+ perror(alist->list[0]); >+ exit(1); >+ } else if (do_cmd_pid == -1) { >+ fatal("fork: %s", strerror(errno)); >+ } >+ signal(SIGTERM, killchild); >+ signal(SIGINT, killchild); >+ signal(SIGHUP, killchild); >+ >+ while (waitpid(do_cmd_pid, &status, 0) != do_cmd_pid) { >+ if (errno != EINTR) { >+ fatal("waitpid: %s", strerror(errno)); >+ } >+ } >+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) >+ return 1; >+ >+ return 0; >+} >+ > typedef struct { > size_t cnt; > char *buf; >@@ -360,10 +400,27 @@ > } > > void >+clearargs(arglist *alist) >+{ >+ int i = alist->num; >+ while (i > 0) { >+ i--; >+ if (alist->list[i]) { >+ xfree(alist->list[i]); >+ alist->list[i] = NULL; >+ } >+ } >+ alist->num = 0; >+} >+ >+void > toremote(char *targ, int argc, char **argv) > { > int i, len; > char *bp, *host, *src, *suser, *thost, *tuser, *arg; >+ arglist alist; >+ memset(&alist, 0, sizeof(alist)); >+ > > *targ++ = 0; > if (*targ == 0) >@@ -381,20 +438,26 @@ > tuser = NULL; > } > >+ if (tuser && !okname(tuser)) { >+ xfree(arg); >+ return; >+ } >+ > for (i = 0; i < argc - 1; i++) { > src = colon(argv[i]); > if (src) { /* remote to remote */ >- static char *ssh_options = >- "-x -o'ClearAllForwardings yes'"; >+ clearargs(&alist); >+ addargs(&alist, "%s", ssh_program); >+ if (verbose_mode) >+ addargs(&alist, "-v"); >+ addargs(&alist, "-x"); >+ addargs(&alist, "-oClearAllForwardings yes"); >+ addargs(&alist, "-n"); > *src++ = 0; > if (*src == 0) > src = "."; > host = strrchr(argv[i], '@'); >- len = strlen(ssh_program) + strlen(argv[i]) + >- strlen(src) + (tuser ? strlen(tuser) : 0) + >- strlen(thost) + strlen(targ) + >- strlen(ssh_options) + CMDNEEDS + 20; >- bp = xmalloc(len); >+ > if (host) { > *host++ = 0; > host = cleanhostname(host); >@@ -402,35 +465,22 @@ > if (*suser == '\0') > suser = pwd->pw_name; > else if (!okname(suser)) { >- xfree(bp); >- continue; >- } >- if (tuser && !okname(tuser)) { >- xfree(bp); > continue; > } >- snprintf(bp, len, >- "%s%s %s -n " >- "-l %s %s %s %s '%s%s%s:%s'", >- ssh_program, verbose_mode ? " -v" : "", >- ssh_options, suser, host, cmd, src, >- tuser ? tuser : "", tuser ? "@" : "", >- thost, targ); >+ addargs(&alist, "-l"); >+ addargs(&alist, "%s", suser); > } else { > host = cleanhostname(argv[i]); >- snprintf(bp, len, >- "exec %s%s %s -n %s " >- "%s %s '%s%s%s:%s'", >- ssh_program, verbose_mode ? " -v" : "", >- ssh_options, host, cmd, src, >+ } >+ >+ addargs(&alist, "%s", host); >+ addargs(&alist, "%s", cmd); >+ addargs(&alist, "%s", src); >+ addargs(&alist, "%s%s%s:%s", > tuser ? tuser : "", tuser ? "@" : "", > thost, targ); >- } >- if (verbose_mode) >- fprintf(stderr, "Executing: %s\n", bp); >- if (system(bp) != 0) >+ if (do_spawnwait(&alist) != 0) > errs = 1; >- (void) xfree(bp); > } else { /* local to remote */ > if (remin == -1) { > len = strlen(targ) + CMDNEEDS + 20; >@@ -454,20 +504,21 @@ > { > int i, len; > char *bp, *host, *src, *suser; >+ arglist alist; >+ memset(&alist, 0, sizeof(alist)); > > for (i = 0; i < argc - 1; i++) { > if (!(src = colon(argv[i]))) { /* Local to local. */ >- len = strlen(_PATH_CP) + strlen(argv[i]) + >- strlen(argv[argc - 1]) + 20; >- bp = xmalloc(len); >- (void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP, >- iamrecursive ? " -r" : "", pflag ? " -p" : "", >- argv[i], argv[argc - 1]); >- if (verbose_mode) >- fprintf(stderr, "Executing: %s\n", bp); >- if (system(bp)) >+ clearargs(&alist); >+ addargs(&alist, "%s", _PATH_CP); >+ if (iamrecursive) >+ addargs(&alist, "-r"); >+ if (pflag) >+ addargs(&alist, "-p"); >+ addargs(&alist, "%s", argv[i]); >+ addargs(&alist, "%s", argv[argc-1]); >+ if (do_spawnwait(&alist)) > ++errs; >- (void) xfree(bp); > continue; > } > *src++ = 0;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1094
:
971
|
1053
|
1054
|
1055
|
1056
|
1057
|
1058