Skip to content

Commit b1d929a

Browse files
committed
Another getifaddrs fix
ia.ifa_data was written out-of-bounds
1 parent 12d2585 commit b1d929a

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

socket/ifaddrs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ int __getifaddrs(struct ifaddrs **ifap)
152152
storage->broadaddr = ifr->ifr_dstaddr;
153153
}
154154
}
155-
storage[i].ia.ifa_data = NULL; /* Nothing here for now. */
155+
storage->ia.ifa_data = NULL; /* Nothing here for now. */
156156
}
157157
free(ibuf);
158158
close(fd);

socket/test-ifaddrs.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ int main(void)
1414
{
1515
struct ifaddrs *ifap;
1616
struct ifaddrs *ifa;
17+
const char *addr;
1718
struct sockaddr_in *sa;
18-
char *addr;
19+
char buf[1024];
1920

2021
if (getifaddrs(&ifap) == -1)
2122
{
@@ -24,11 +25,17 @@ int main(void)
2425
}
2526
for (ifa = ifap; ifa; ifa = ifa->ifa_next)
2627
{
27-
if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET)
28+
if (ifa->ifa_addr)
2829
{
29-
sa = (struct sockaddr_in *) ifa->ifa_addr;
30-
addr = inet_ntoa(sa->sin_addr);
31-
printf("Interface: %s\tAddress: %s\n", ifa->ifa_name, addr);
30+
switch (ifa->ifa_addr->sa_family)
31+
{
32+
case AF_INET:
33+
case AF_INET6:
34+
sa = (struct sockaddr_in *) ifa->ifa_addr;
35+
addr = inet_ntop(ifa->ifa_addr->sa_family, &sa->sin_addr, buf, sizeof(buf));
36+
printf("Interface: %s\tAddress: %s\n", ifa->ifa_name, addr);
37+
break;
38+
}
3239
}
3340

3441
}

0 commit comments

Comments
 (0)