From 5088aa38a3805ee7177fc52012d9b09f2fb4791a Mon Sep 17 00:00:00 2001 From: Kris Kennaway Date: Sun, 8 Oct 2000 08:02:35 +0000 Subject: [PATCH] Don't overflow our fd_set. This is not a full sync with KAME because there are a whole lot of other changes which may not be suitable for us. Obtained from: KAME --- sbin/ping6/ping6.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/sbin/ping6/ping6.c b/sbin/ping6/ping6.c index e25801358804..f85353447227 100644 --- a/sbin/ping6/ping6.c +++ b/sbin/ping6/ping6.c @@ -112,10 +112,7 @@ static const char rcsid[] = #include #include -#include #include -#include -#include #include #include #include @@ -268,7 +265,8 @@ main(argc, argv) struct sockaddr_in6 from; struct timeval timeout; struct addrinfo hints; - fd_set fdset; + fd_set *fdmaskp; + int fdmasks; register int cc, i; int ch, fromlen, hold, packlen, preload, optval, ret_ga; u_char *datap, *packet; @@ -870,9 +868,10 @@ main(argc, argv) (void)setitimer(ITIMER_REAL, &itimer, NULL); } - FD_ZERO(&fdset); - timeout.tv_sec = 0; - timeout.tv_usec = 10000; + fdmasks = howmany(s+1, NFDBITS); + if ((fdmaskp = malloc(fdmasks)) == NULL) + err(1, "malloc"); + for (;;) { struct msghdr m; struct cmsghdr *cm; @@ -881,8 +880,11 @@ main(argc, argv) if (options & F_FLOOD) { pinger(); - FD_SET(s, &fdset); - if (select(s + 1, &fdset, NULL, NULL, &timeout) < 1) + timeout.tv_sec = 0; + timeout.tv_usec = 10000; + memset(fdmaskp, 0, fdmasks); + FD_SET(s, fdmaskp); + if (select(s + 1, fdmaskp, NULL, NULL, &timeout) < 1) continue; } fromlen = sizeof(from);