diff options
| author | 2013-03-21 04:43:15 +0000 | |
|---|---|---|
| committer | 2013-03-21 04:43:15 +0000 | |
| commit | 8ae2d34229e0135c1ca81f3a93bd8889498ab288 (patch) | |
| tree | 958397ace1a8632387c398ff35079e6990aaf1c3 /usr.sbin/rtadvd/if.c | |
| parent | remove excessive includes (diff) | |
| download | wireguard-openbsd-8ae2d34229e0135c1ca81f3a93bd8889498ab288.tar.xz wireguard-openbsd-8ae2d34229e0135c1ca81f3a93bd8889498ab288.zip | |
create realloc() loops around sysctl for array-based mibs, in programs
which want a "full" dump
ok dlg
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; + } } /* |
