diff options
Diffstat (limited to 'crypto/heimdal/appl/rcp/rcp.c')
-rw-r--r-- | crypto/heimdal/appl/rcp/rcp.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/crypto/heimdal/appl/rcp/rcp.c b/crypto/heimdal/appl/rcp/rcp.c index c54409a..9a138c7 100644 --- a/crypto/heimdal/appl/rcp/rcp.c +++ b/crypto/heimdal/appl/rcp/rcp.c @@ -43,6 +43,7 @@ int pflag, iamremote, iamrecursive, targetshouldbedirectory; int doencrypt, noencrypt; int usebroken, usekrb4, usekrb5, forwardtkt; char *port; +int eflag = 0; #define CMDNEEDS 64 char cmd[CMDNEEDS]; /* must hold "rcp -r -p -d\0" */ @@ -71,6 +72,7 @@ struct getargs args[] = { { NULL, 'x', arg_flag, &doencrypt, "use encryption" }, { NULL, 'z', arg_flag, &noencrypt, "don't encrypt" }, { NULL, 'd', arg_flag, &targetshouldbedirectory }, + { NULL, 'e', arg_flag, &eflag, "passed to rsh" }, { NULL, 'f', arg_flag, &fflag }, { NULL, 't', arg_flag, &tflag }, { "version", 0, arg_flag, &version_flag }, @@ -117,13 +119,15 @@ main(int argc, char **argv) if (fflag) { /* Follow "protocol", send data. */ response(); - setuid(userid); + if (setuid(userid) < 0) + errx(1, "setuid failed"); source(argc, argv); exit(errs); } if (tflag) { /* Receive data. */ - setuid(userid); + if (setuid(userid) < 0) + errx(1, "setuid failed"); sink(argc, argv); exit(errs); } @@ -177,6 +181,7 @@ toremote(char *targ, int argc, char **argv) for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src) { /* remote to remote */ + int ret; *src++ = 0; if (*src == 0) src = "."; @@ -188,26 +193,27 @@ toremote(char *targ, int argc, char **argv) suser = pwd->pw_name; else if (!okname(suser)) continue; - asprintf(&bp, - "%s %s -l %s -n %s %s '%s%s%s:%s'", - _PATH_RSH, host, suser, cmd, src, + ret = asprintf(&bp, + "%s%s %s -l %s -n %s %s '%s%s%s:%s'", + _PATH_RSH, eflag ? " -e" : "", + host, suser, cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ); } else { - asprintf(&bp, - "exec %s %s -n %s %s '%s%s%s:%s'", - _PATH_RSH, argv[i], cmd, src, - tuser ? tuser : "", tuser ? "@" : "", - thost, targ); + ret = asprintf(&bp, + "exec %s%s %s -n %s %s '%s%s%s:%s'", + _PATH_RSH, eflag ? " -e" : "", + argv[i], cmd, src, + tuser ? tuser : "", tuser ? "@" : "", + thost, targ); } - if (bp == NULL) + if (ret == -1) err (1, "malloc"); susystem(bp, userid); free(bp); } else { /* local to remote */ if (remin == -1) { - asprintf(&bp, "%s -t %s", cmd, targ); - if (bp == NULL) + if (asprintf(&bp, "%s -t %s", cmd, targ) == -1) err (1, "malloc"); host = thost; @@ -217,7 +223,8 @@ toremote(char *targ, int argc, char **argv) if (response() < 0) exit(1); free(bp); - setuid(userid); + if (setuid(userid) < 0) + errx(1, "setuid failed"); } source(1, argv+i); } @@ -231,11 +238,13 @@ tolocal(int argc, char **argv) char *bp, *host, *src, *suser; for (i = 0; i < argc - 1; i++) { + int ret; + if (!(src = colon(argv[i]))) { /* Local to local. */ - asprintf(&bp, "exec %s%s%s %s %s", _PATH_CP, + ret = asprintf(&bp, "exec %s%s%s %s %s", _PATH_CP, iamrecursive ? " -PR" : "", pflag ? " -p" : "", argv[i], argv[argc - 1]); - if (bp == NULL) + if (ret == -1) err (1, "malloc"); if (susystem(bp, userid)) ++errs; @@ -256,8 +265,8 @@ tolocal(int argc, char **argv) else if (!okname(suser)) continue; } - asprintf(&bp, "%s -f %s", cmd, src); - if (bp == NULL) + ret = asprintf(&bp, "%s -f %s", cmd, src); + if (ret == -1) err (1, "malloc"); if (do_cmd(host, suser, bp, &remin, &remout) < 0) { free(bp); @@ -266,7 +275,8 @@ tolocal(int argc, char **argv) } free(bp); sink(1, argv + argc - 1); - seteuid(0); + if (seteuid(0) < 0) + exit(1); close(remin); remin = remout = -1; } @@ -319,6 +329,7 @@ syserr: run_err("%s: %s", name, strerror(errno)); if (response() < 0) goto next; } +#undef MODEMASK #define MODEMASK (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) snprintf(buf, sizeof(buf), "C%04o %lu %s\n", stb.st_mode & MODEMASK, @@ -768,6 +779,8 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout) args[i++] = "-p"; args[i++] = port; } + if (eflag) + args[i++] = "-e"; if (remuser != NULL) { args[i++] = "-l"; args[i++] = remuser; |