summaryrefslogtreecommitdiffstats
path: root/contrib/traceroute
diff options
context:
space:
mode:
authorkris <kris@FreeBSD.org>2000-10-08 07:58:32 +0000
committerkris <kris@FreeBSD.org>2000-10-08 07:58:32 +0000
commitbf6b0f4463166e362011c5463d166f823885f3af (patch)
treecf8064b8618bc53e6c232bdc2abccdf22517db69 /contrib/traceroute
parentc84667a83fb82003021c9a3d89aa6ec8d3b6a454 (diff)
downloadFreeBSD-src-bf6b0f4463166e362011c5463d166f823885f3af.zip
FreeBSD-src-bf6b0f4463166e362011c5463d166f823885f3af.tar.gz
Don't write past the end of our fd_set
Obtained from: OpenBSD, via KAME
Diffstat (limited to 'contrib/traceroute')
-rw-r--r--contrib/traceroute/traceroute.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/contrib/traceroute/traceroute.c b/contrib/traceroute/traceroute.c
index cc0bedb..a733a8a 100644
--- a/contrib/traceroute/traceroute.c
+++ b/contrib/traceroute/traceroute.c
@@ -882,15 +882,19 @@ int
wait_for_reply(register int sock, register struct sockaddr_in *fromp,
register struct timeval *tp)
{
- fd_set fds;
+ fd_set *fdsp;
+ size_t nfds;
struct timeval now, wait;
struct timezone tz;
register int cc = 0;
register int error;
int fromlen = sizeof(*fromp);
- FD_ZERO(&fds);
- FD_SET(sock, &fds);
+ nfds = howmany(sock + 1, NFDBITS);
+ if ((fdsp = malloc(nfds)) == NULL)
+ err(1, "malloc");
+ memset(fdsp, 0, nfds);
+ FD_SET(sock, fdsp);
wait.tv_sec = tp->tv_sec + waittime;
wait.tv_usec = tp->tv_usec;
@@ -901,7 +905,7 @@ wait_for_reply(register int sock, register struct sockaddr_in *fromp,
wait.tv_usec = 1;
}
- error = select(sock + 1, &fds, (fd_set *)0, (fd_set *)0, &wait);
+ error = select(sock + 1, fdsp, NULL, NULL, &wait);
if (error == -1 && errno == EINVAL) {
Fprintf(stderr, "%s: botched select() args\n", prog);
exit(1);
@@ -910,6 +914,7 @@ wait_for_reply(register int sock, register struct sockaddr_in *fromp,
cc = recvfrom(s, (char *)packet, sizeof(packet), 0,
(struct sockaddr *)fromp, &fromlen);
+ free(fdsp);
return(cc);
}
OpenPOWER on IntegriCloud