summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorderaadt <>2013-03-20 14:15:56 +0000
committerderaadt <>2013-03-20 14:15:56 +0000
commitfe06028553c72e4063735e46f4f76fda7a6c9d39 (patch)
tree9e98d8cd552e574c2ebb8fbcf19bf8bed9055494
parent5fde2c71362f5a21bf158abc2b2e73674095d596 (diff)
downloadopenbsd-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.c30
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) {