From fe06028553c72e4063735e46f4f76fda7a6c9d39 Mon Sep 17 00:00:00 2001 From: deraadt <> Date: Wed, 20 Mar 2013 14:15:56 +0000 Subject: 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 --- src/lib/libc/net/getifaddrs.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'src/lib') 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 @@ -/* $OpenBSD: getifaddrs.c,v 1.10 2008/11/24 20:08:49 claudio Exp $ */ +/* $OpenBSD: getifaddrs.c,v 1.11 2013/03/20 14:15:56 deraadt Exp $ */ /* * Copyright (c) 1995, 1999 @@ -52,7 +52,7 @@ getifaddrs(struct ifaddrs **pif) int ncnt = 0; int mib[6]; size_t needed; - char *buf; + char *buf = NULL, *bufp; char *next; struct ifaddrs *cif = 0; char *p, *p0; @@ -74,13 +74,25 @@ getifaddrs(struct ifaddrs **pif) mib[3] = 0; /* wildcard address family */ mib[4] = NET_RT_IFLIST; mib[5] = 0; /* no flags */ - if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) - return (-1); - if ((buf = malloc(needed)) == NULL) - return (-1); - if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { - free(buf); - return (-1); + while (1) { + if (sysctl(mib, 6, NULL, &needed, NULL, 0) == -1) { + free(buf); + return (-1); + } + if (needed == 0) + break; + if ((bufp = realloc(buf, needed)) == NULL) { + free(buf); + return (-1); + } + buf = bufp; + if (sysctl(mib, 6, buf, &needed, NULL, 0) == -1) { + if (errno == ENOMEM) + continue; + free(buf); + return (-1); + } + break; } for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { -- cgit v1.2.3-55-g6feb