Mercurial > hg > dhcpcd
changeset 5225:2b18af138e24 draft
privsep: sockaddr len should be socklen_t
While ps_root_getifaddrs is only for capsicum, it's highly portable
and thus in the privsep-root rather than privsep-bsd.
As such, store the sockaddr len as socklen_t because that's what
POSIX demands.
It's only a few more bytes and I'd rather make this change now
than it potentially bite me later.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Thu, 14 May 2020 01:15:39 +0100 |
| parents | a71e4a05aa61 |
| children | 06575a46bbdd |
| files | src/privsep-root.c |
| diffstat | 1 files changed, 24 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/src/privsep-root.c Wed May 13 20:58:58 2020 +0100 +++ b/src/privsep-root.c Thu May 14 01:15:39 2020 +0100 @@ -302,6 +302,7 @@ struct ifaddrs *ifaddrs, *ifa; size_t len; uint8_t *buf, *sap; + socklen_t salen; void *ifdata; if (getifaddrs(&ifaddrs) == -1) @@ -321,7 +322,7 @@ for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { len += ALIGN(sizeof(*ifa)); len += ALIGN(IFNAMSIZ); - len += ALIGN(sizeof(*sap) * IFA_NADDRS); + len += ALIGN(sizeof(salen) * IFA_NADDRS); if (ifa->ifa_addr != NULL) len += ALIGN(sa_len(ifa->ifa_addr)); if (ifa->ifa_netmask != NULL) @@ -352,16 +353,17 @@ strlcpy((char *)buf, ifa->ifa_name, IFNAMSIZ); buf += ALIGN(IFNAMSIZ); sap = buf; - buf += ALIGN(sizeof(*sap) * IFA_NADDRS); + buf += ALIGN(sizeof(salen) * IFA_NADDRS); -#define COPYINSA(addr) \ - do { \ - *sap = sa_len((addr)); \ - if (*sap != 0) { \ - memcpy(buf, (addr), *sap); \ - buf += ALIGN(*sap); \ - } \ - sap++; \ +#define COPYINSA(addr) \ + do { \ + salen = sa_len((addr)); \ + if (salen != 0) { \ + memcpy(sap, &salen, sizeof(salen)); \ + memcpy(buf, (addr), salen); \ + buf += ALIGN(salen); \ + } \ + sap += sizeof(salen); \ } while (0 /*CONSTCOND */) if (ifa->ifa_addr != NULL) @@ -718,8 +720,8 @@ { struct ifaddrs *ifa; void *buf = NULL; - char *bp; - unsigned char *sap; + char *bp, *sap; + socklen_t salen; size_t len; ssize_t err; @@ -741,26 +743,27 @@ *ifahead = (struct ifaddrs *)(void *)bp; for (ifa = *ifahead; len != 0; ifa = ifa->ifa_next) { if (len < ALIGN(sizeof(*ifa)) + - ALIGN(IFNAMSIZ) + ALIGN(sizeof(*sap) * IFA_NADDRS)) + ALIGN(IFNAMSIZ) + ALIGN(sizeof(salen) * IFA_NADDRS)) goto err; bp += ALIGN(sizeof(*ifa)); ifa->ifa_name = bp; bp += ALIGN(IFNAMSIZ); - sap = (unsigned char *)bp; - bp += ALIGN(sizeof(*sap) * IFA_NADDRS); + sap = bp; + bp += ALIGN(sizeof(salen) * IFA_NADDRS); len -= ALIGN(sizeof(*ifa)) + - ALIGN(IFNAMSIZ) + ALIGN(sizeof(*sap) * IFA_NADDRS); + ALIGN(IFNAMSIZ) + ALIGN(sizeof(salen) * IFA_NADDRS); #define COPYOUTSA(addr) \ do { \ - if (len < *sap) \ + memcpy(&salen, sap, sizeof(salen)); \ + if (len < salen) \ goto err; \ - if (*sap != 0) { \ + if (salen != 0) { \ (addr) = (struct sockaddr *)bp; \ - bp += ALIGN(*sap); \ - len -= ALIGN(*sap); \ + bp += ALIGN(salen); \ + len -= ALIGN(salen); \ } \ - sap++; \ + sap += sizeof(salen); \ } while (0 /* CONSTCOND */) COPYOUTSA(ifa->ifa_addr);
