bin/76075: arp program failures due to ARP table growth
Dmitrij Tejblum
tejblum at yandex-team.ru
Sun Jan 23 03:20:25 PST 2005
The following reply was made to PR bin/76075; it has been noted by GNATS.
From: Dmitrij Tejblum <tejblum at yandex-team.ru>
To: Maxim Konovalov <maxim at macomnet.ru>
Cc: bug-followup at freebsd.org
Subject: Re: bin/76075: arp program failures due to ARP table growth
Date: Sun, 23 Jan 2005 14:17:16 +0300 (MSK)
> What is your opinion about an enclosed diff (a bit more adaptable
> algorithm stolen from killall(1))?
Your patch has a few small mistakes. E.g. it reallocates the buffer right
after it was allocated without any attempt to fill it. The following variant
is better in my opinion. But anyway, something like it should be OK.
--- arp.c Tue Jan 11 02:00:45 2005
+++ arp.c Sun Jan 23 13:40:36 2005
@@ -456,12 +456,12 @@
{
int mib[6];
size_t needed;
- char *lim, *buf, *next;
+ char *lim, *buf, *newbuf, *next;
struct rt_msghdr *rtm;
struct sockaddr_inarp *sin2;
struct sockaddr_dl *sdl;
char ifname[IF_NAMESIZE];
- int found_entry = 0;
+ int st, found_entry = 0;
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
@@ -473,9 +473,16 @@
err(1, "route-sysctl-estimate");
if (needed == 0) /* empty table */
return 0;
- if ((buf = malloc(needed)) == NULL)
- err(1, "malloc");
- if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
+ buf = NULL;
+ do {
+ needed += needed / 2;
+ newbuf = realloc(buf, needed);
+ if (newbuf == NULL)
+ err(1, "realloc"); /* also free all allocated memory */
+ buf = newbuf;
+ st = sysctl(mib, 6, buf, &needed, NULL, 0);
+ } while (st == -1 && errno == ENOMEM);
+ if (st == -1)
err(1, "actual retrieval of routing table");
lim = buf + needed;
for (next = buf; next < lim; next += rtm->rtm_msglen) {
More information about the freebsd-bugs
mailing list