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;