summaryrefslogtreecommitdiffstats
path: root/crypto/heimdal/appl/rcp/rcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/heimdal/appl/rcp/rcp.c')
-rw-r--r--crypto/heimdal/appl/rcp/rcp.c51
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;
OpenPOWER on IntegriCloud