Page MenuHomeFreeBSD

D15488.id42737.diff
No OneTemporary

D15488.id42737.diff

Index: usr.bin/netstat/route.c
===================================================================
--- usr.bin/netstat/route.c
+++ usr.bin/netstat/route.c
@@ -252,7 +252,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;
@@ -303,10 +303,20 @@
if (sysctl(mib, nitems(mib), NULL, &needed, NULL, 0) < 0)
err(EX_OSERR, "sysctl: net.route.0.%d.dump.%d estimate", af,
fibnum);
- if ((buf = malloc(needed)) == NULL)
+retry:
+ if ((buf = malloc(roundup2(needed, PAGE_SIZE))) == 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 > 9)
+ err(1, "sysctl: net.route.0.%d.dump.%d", af, fibnum);
+ warnx("sysctl: net.route.0.%d.dump.%d: routing table grew "
+ "beyond estimated buffer size (%zu), retrying with "
+ "larger buffer...", 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");

File Metadata

Mime Type
text/plain
Expires
Sat, Dec 20, 5:19 AM (4 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27092376
Default Alt Text
D15488.id42737.diff (1 KB)

Event Timeline