Apply by doing cd /usr/src/sbin/ping patch -p0 < ping.patch And then to rebuild and install make && make install Index: ping.c =================================================================== RCS file: /cvs/src/sbin/ping/ping.c,v retrieving revision 1.25 retrieving revision 1.28 diff -u -r1.25 -r1.28 --- ping.c 1997/08/06 01:45:24 1.25 +++ ping.c 1998/03/31 23:04:10 1.28 @@ -1,4 +1,4 @@ -/* $OpenBSD: ping.c,v 1.25 1997/08/06 01:45:24 deraadt Exp $ */ +/* $OpenBSD: ping.c,v 1.28 1998/03/31 23:04:10 deraadt Exp $ */ /* $NetBSD: ping.c,v 1.20 1995/08/11 22:37:58 cgd Exp $ */ /* @@ -47,7 +47,7 @@ #if 0 static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93"; #else -static char rcsid[] = "$OpenBSD: ping.c,v 1.25 1997/08/06 01:45:24 deraadt Exp $"; +static char rcsid[] = "$OpenBSD: ping.c,v 1.28 1998/03/31 23:04:10 deraadt Exp $"; #endif #endif /* not lint */ @@ -438,9 +438,7 @@ * ethernet, or just want to fill the arp cache to get some stuff for * /etc/ethers. */ - hold = 48 * 1024; - (void)setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&hold, - sizeof(hold)); + (void)setsockopt(s, SOL_SOCKET, SO_RCVBUF, &packlen, sizeof(packlen)); if (to->sin_family == AF_INET) (void)printf("PING %s (%s): %d data bytes\n", hostname, @@ -469,6 +467,7 @@ struct sockaddr_in from; register int cc; int fromlen; + sigset_t omask, nmask; if (options & F_FLOOD) { pinger(); @@ -488,7 +487,11 @@ perror("ping: recvfrom"); continue; } + sigemptyset(&nmask); + sigaddset(&nmask, SIGALRM); + sigprocmask(SIG_BLOCK, &nmask, &omask); pr_pack((char *)packet, cc, &from); + sigprocmask(SIG_SETMASK, &omask, NULL); if (npackets && nreceived >= npackets) break; } @@ -614,7 +617,7 @@ { register struct icmp *icp; register in_addr_t l; - register int i, j; + register u_int i, j; register u_char *cp,*dp; static int old_rrlen; static char old_rr[MAX_IPOPTLEN]; @@ -765,9 +768,14 @@ cp += i; break; } - old_rrlen = i; - memcpy(old_rr, cp, i); + if (i < MAX_IPOPTLEN) { + old_rrlen = i; + memcpy(old_rr, cp, i); + } else + old_rrlen = 0; + (void)printf("\nRR: "); + j = 0; for (;;) { l = *++cp; l = (l<<8) + *++cp; @@ -779,8 +787,13 @@ (void)printf("\t%s", pr_addr(ntohl(l))); hlen -= 4; i -= 4; + j += 4; if (i <= 0) break; + if (j >= MAX_IPOPTLEN) { + (void)printf("\t(truncated route)"); + break; + } (void)putchar('\n'); } break;