From: Roy Marples Date: Fri, 29 Nov 2019 14:15:56 +0000 (+0000) Subject: Linux: Improve privsep write unsigned int to path API X-Git-Tag: v9.0.0~196 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05e0f824b136d289444819ccdbc6fb1715d0ea2f;p=thirdparty%2Fdhcpcd.git Linux: Improve privsep write unsigned int to path API --- diff --git a/src/privsep-linux.c b/src/privsep-linux.c index abb4e025..7582aeea 100644 --- a/src/privsep-linux.c +++ b/src/privsep-linux.c @@ -60,26 +60,29 @@ ps_root_dosendnetlink(int protocol, struct msghdr *msg) static ssize_t ps_root_dowritepathuint(const void *data, size_t len) { - const char *path = data, *valp = data, *end; + const char *path = data; FILE *fp; ssize_t r; + size_t plen; unsigned int val; - for (end = path + len; valp < end; val++) { - if (*valp == '\0') { - valp++; - break; - } + if (len < sizeof(plen)) { + errno = EINVAL; + return -1; } - if (valp == end) { + + memcpy(&plen, path, sizeof(plen)); + path += sizeof(plen); + if (sizeof(plen) + plen + sizeof(val) > len) { errno = EINVAL; return -1; } + memcpy(&val, path + plen, sizeof(val)); + fp = fopen(path, "w"); if (fp == NULL) return -1; - val = (unsigned int)*valp; r = fprintf(fp, "%u\n", val); fclose(fp); return r; @@ -119,15 +122,18 @@ ps_root_writepathuint(struct dhcpcd_ctx *ctx, const char *path, { char buf[PS_BUFLEN]; size_t plen = strlen(path) + 1; - size_t len = plen + sizeof(val); + size_t len = sizeof(plen) + plen + sizeof(val); + + return 0; if (len > sizeof(buf)) { errno = ENOBUFS; return -1; } - memcpy(buf, path, plen); - memcpy(buf + plen, &val, sizeof(val)); + memcpy(buf, &plen, sizeof(plen)); + memcpy(buf + sizeof(plen), path, plen); + memcpy(buf + sizeof(plen) + plen, &val, sizeof(val)); return ps_sendcmd(ctx, ctx->ps_root_fd, PS_WRITEPATHUINT, 0, buf, len); }