summaryrefslogtreecommitdiffstats
path: root/src/privsep-root.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-01-21 20:17:27 +0000
committerRoy Marples <roy@marples.name>2020-01-21 20:17:27 +0000
commit056aca1c31239c8a65ef5a1c42fe4de841d2c064 (patch)
treec2ae44d8f7c9202ef9dc0369eaf933e6a1e9551d /src/privsep-root.c
parent8a4cd387823dc5e122839af9d9463985cb99f383 (diff)
downloaddhcpcd-056aca1c31239c8a65ef5a1c42fe4de841d2c064.tar.xz
privsep: Only fetch PRIVSEP_USER at init
And not each time it's needed - we don't want a sudden change in the details to affect a running dhcpcd.
Diffstat (limited to 'src/privsep-root.c')
-rw-r--r--src/privsep-root.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/src/privsep-root.c b/src/privsep-root.c
index 076d71de..2dc57ae7 100644
--- a/src/privsep-root.c
+++ b/src/privsep-root.c
@@ -203,7 +203,7 @@ ps_root_run_script(struct dhcpcd_ctx *ctx, const void *data, size_t len)
}
static ssize_t
-ps_root_docopy(const char *dir, const char *file)
+ps_root_docopy(struct dhcpcd_ctx *ctx, const char *file)
{
char path[PATH_MAX], buf[BUFSIZ], *slash;
@@ -216,7 +216,8 @@ ps_root_docopy(const char *dir, const char *file)
struct timeval ts[2];
#endif
- if (snprintf(path, sizeof(path), "%s/%s", dir, file) == -1)
+ if (snprintf(path, sizeof(path), "%s/%s",
+ ctx->ps_user->pw_dir, file) == -1)
return -1;
if (stat(file, &from_sb) == -1)
return -1;
@@ -275,22 +276,7 @@ ps_root_docopy(const char *dir, const char *file)
}
static ssize_t
-ps_root_docopy1(const char *file)
-{
- struct passwd *pw;
-
- errno = 0;
- if ((pw = getpwnam(PRIVSEP_USER)) == NULL) {
- if (errno == 0)
- errno = ENOENT;
- return -1;
- }
-
- return ps_root_docopy(pw->pw_dir, file);
-}
-
-static ssize_t
-ps_root_dofileop(void *data, size_t len, uint8_t op)
+ps_root_dofileop(struct dhcpcd_ctx *ctx, void *data, size_t len, uint8_t op)
{
char *path = data;
size_t plen;
@@ -309,7 +295,7 @@ ps_root_dofileop(void *data, size_t len, uint8_t op)
switch(op) {
case PS_COPY:
- return ps_root_docopy1(path);
+ return ps_root_docopy(ctx, path);
case PS_UNLINK:
return (ssize_t)unlink(path);
default:
@@ -389,7 +375,7 @@ ps_root_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg)
break;
case PS_COPY: /* FALLTHROUGH */
case PS_UNLINK:
- err = ps_root_dofileop(data, len, psm->ps_cmd);
+ err = ps_root_dofileop(ctx, data, len, psm->ps_cmd);
break;
default:
err = ps_root_os(psm, msg);