diff options
author | deraadt <> | 2013-03-20 14:15:56 +0000 |
---|---|---|
committer | deraadt <> | 2013-03-20 14:15:56 +0000 |
commit | fe06028553c72e4063735e46f4f76fda7a6c9d39 (patch) | |
tree | 9e98d8cd552e574c2ebb8fbcf19bf8bed9055494 | |
parent | 5fde2c71362f5a21bf158abc2b2e73674095d596 (diff) | |
download | openbsd-fe06028553c72e4063735e46f4f76fda7a6c9d39.tar.gz openbsd-fe06028553c72e4063735e46f4f76fda7a6c9d39.tar.bz2 openbsd-fe06028553c72e4063735e46f4f76fda7a6c9d39.zip |
Use a realloc() loop around the sysctl() for NET_RT_IFLIST, in case an
interface is added at just the right... wrong moment.
ok millert dlg
-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) { |