[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bin/76075: arp program failures due to ARP table growth
- Subject: bin/76075: arp program failures due to ARP table growth
- From: tejblum at yandex-team.ru (Dmitrij Tejblum)
- Date: Sun Jan 23 03:20:27 2005
The following reply was made to PR bin/76075; it has been noted by GNATS.
From: Dmitrij Tejblum <tejblum_(_at_)_yandex-team_(_dot_)_ru>
To: Maxim Konovalov <maxim_(_at_)_macomnet_(_dot_)_ru>
Cc: bug-followup_(_at_)_freebsd_(_dot_)_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) {
Visit your host, monkey.org