diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libc/net/getifaddrs.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/lib/libc/net/getifaddrs.c b/src/lib/libc/net/getifaddrs.c index 6f7ea15721..da42a23783 100644 --- a/src/lib/libc/net/getifaddrs.c +++ b/src/lib/libc/net/getifaddrs.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: getifaddrs.c,v 1.10 2008/11/24 20:08:49 claudio Exp $ */ | 1 | /* $OpenBSD: getifaddrs.c,v 1.11 2013/03/20 14:15:56 deraadt Exp $ */ |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * Copyright (c) 1995, 1999 | 4 | * Copyright (c) 1995, 1999 |
| @@ -52,7 +52,7 @@ getifaddrs(struct ifaddrs **pif) | |||
| 52 | int ncnt = 0; | 52 | int ncnt = 0; |
| 53 | int mib[6]; | 53 | int mib[6]; |
| 54 | size_t needed; | 54 | size_t needed; |
| 55 | char *buf; | 55 | char *buf = NULL, *bufp; |
| 56 | char *next; | 56 | char *next; |
| 57 | struct ifaddrs *cif = 0; | 57 | struct ifaddrs *cif = 0; |
| 58 | char *p, *p0; | 58 | char *p, *p0; |
| @@ -74,13 +74,25 @@ getifaddrs(struct ifaddrs **pif) | |||
| 74 | mib[3] = 0; /* wildcard address family */ | 74 | mib[3] = 0; /* wildcard address family */ |
| 75 | mib[4] = NET_RT_IFLIST; | 75 | mib[4] = NET_RT_IFLIST; |
| 76 | mib[5] = 0; /* no flags */ | 76 | mib[5] = 0; /* no flags */ |
| 77 | if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) | 77 | while (1) { |
| 78 | return (-1); | 78 | if (sysctl(mib, 6, NULL, &needed, NULL, 0) == -1) { |
| 79 | if ((buf = malloc(needed)) == NULL) | 79 | free(buf); |
| 80 | return (-1); | 80 | return (-1); |
| 81 | if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { | 81 | } |
| 82 | free(buf); | 82 | if (needed == 0) |
| 83 | return (-1); | 83 | break; |
| 84 | if ((bufp = realloc(buf, needed)) == NULL) { | ||
| 85 | free(buf); | ||
| 86 | return (-1); | ||
| 87 | } | ||
| 88 | buf = bufp; | ||
| 89 | if (sysctl(mib, 6, buf, &needed, NULL, 0) == -1) { | ||
| 90 | if (errno == ENOMEM) | ||
| 91 | continue; | ||
| 92 | free(buf); | ||
| 93 | return (-1); | ||
| 94 | } | ||
| 95 | break; | ||
| 84 | } | 96 | } |
| 85 | 97 | ||
| 86 | for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { | 98 | for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { |
