diff options
Diffstat (limited to 'usr.sbin/rtadvd/if.c')
| -rw-r--r-- | usr.sbin/rtadvd/if.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/usr.sbin/rtadvd/if.c b/usr.sbin/rtadvd/if.c index 0917ff2851c..eb3f464adbc 100644 --- a/usr.sbin/rtadvd/if.c +++ b/usr.sbin/rtadvd/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.24 2011/07/05 05:13:04 claudio Exp $ */ +/* $OpenBSD: if.c,v 1.25 2013/03/21 04:43:15 deraadt Exp $ */ /* $KAME: if.c,v 1.17 2001/01/21 15:27:30 itojun Exp $ */ /* @@ -437,14 +437,20 @@ get_iflist(char **buf, size_t *size) mib[3] = AF_INET6; mib[4] = NET_RT_IFLIST; mib[5] = 0; - - if (sysctl(mib, 6, NULL, size, NULL, 0) < 0) - fatal("sysctl: iflist size get failed"); - if ((*buf = malloc(*size)) == NULL) - fatal("malloc"); - if (sysctl(mib, 6, *buf, size, NULL, 0) < 0) - fatal("sysctl: iflist get failed"); - return; + while (1) { + if (sysctl(mib, 6, NULL, size, NULL, 0) == -1) + fatal("sysctl: iflist size get failed"); + if (*size == 0) + break; + if ((*buf = realloc(*buf, *size)) == NULL) + fatal("malloc"); + if (sysctl(mib, 6, *buf, size, NULL, 0) == -1) { + if (errno == ENOMEM) + continue; + fatal("sysctl: iflist get failed"); + } + break; + } } /* |
