Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Jan 2005 11:20:23 GMT
From:      Dmitrij Tejblum <tejblum@yandex-team.ru>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/76075: arp program failures due to ARP table growth
Message-ID:  <200501231120.j0NBKNdW022301@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/76075; it has been noted by GNATS.

From: Dmitrij Tejblum <tejblum@yandex-team.ru>
To: Maxim Konovalov <maxim@macomnet.ru>
Cc: bug-followup@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) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200501231120.j0NBKNdW022301>