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>