struct ifaddrs *ifaddrs, *ifa;
size_t len;
uint8_t *buf, *sap;
+ socklen_t salen;
void *ifdata;
if (getifaddrs(&ifaddrs) == -1)
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)
strlcpy((char *)buf, ifa->ifa_name, IFNAMSIZ);
buf += ALIGN(IFNAMSIZ);
sap = buf;
- buf += ALIGN(sizeof(*sap) * IFA_NADDRS);
-
-#define COPYINSA(addr) \
- do { \
- *sap = sa_len((addr)); \
- if (*sap != 0) { \
- memcpy(buf, (addr), *sap); \
- buf += ALIGN(*sap); \
- } \
- sap++; \
+ buf += ALIGN(sizeof(salen) * IFA_NADDRS);
+
+#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)
{
struct ifaddrs *ifa;
void *buf = NULL;
- char *bp;
- unsigned char *sap;
+ char *bp, *sap;
+ socklen_t salen;
size_t len;
ssize_t err;
*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);