diff options
| author | Roy Marples <roy@marples.name> | 2020-01-21 20:17:27 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-01-21 20:17:27 +0000 |
| commit | 056aca1c31239c8a65ef5a1c42fe4de841d2c064 (patch) | |
| tree | c2ae44d8f7c9202ef9dc0369eaf933e6a1e9551d /src/privsep-root.c | |
| parent | 8a4cd387823dc5e122839af9d9463985cb99f383 (diff) | |
| download | dhcpcd-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.c | 26 |
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); |
