Index: usr.bin/netstat/route.c =================================================================== --- usr.bin/netstat/route.c (revision 308009) +++ usr.bin/netstat/route.c (working copy) @@ -64,6 +64,7 @@ #include #include #include +#include #include #include "netstat.h" #include "nl_defs.h" @@ -247,7 +248,7 @@ char *buf, *next, *lim; struct rt_msghdr *rtm; struct sockaddr *sa; - int fam = AF_UNSPEC, ifindex = 0, size; + int fam = AF_UNSPEC, ifindex = 0, size, count = 0; int need_table_close = false; struct ifaddrs *ifap, *ifa; @@ -298,10 +299,19 @@ if (sysctl(mib, nitems(mib), NULL, &needed, NULL, 0) < 0) err(EX_OSERR, "sysctl: net.route.0.%d.dump.%d estimate", af, fibnum); +retry: if ((buf = malloc(needed)) == NULL) errx(2, "malloc(%lu)", (unsigned long)needed); - if (sysctl(mib, nitems(mib), buf, &needed, NULL, 0) < 0) - err(1, "sysctl: net.route.0.%d.dump.%d", af, fibnum); + if (sysctl(mib, nitems(mib), buf, &needed, NULL, 0) < 0) { + if (count > 10) + err(1, "sysctl: net.route.0.%d.dump.%d", af, fibnum); + warnx("sysctl: net.route.0.%d.dump.%d: %zu bytes not enough " + "for current routing table", af, fibnum, needed); + free(buf); + needed = needed * 1.25; + count++; + goto retry; + } lim = buf + needed; xo_open_container("route-table"); xo_open_list("rt-family");