Module Name: src
Committed By: kefren
Date: Fri Jul 2 12:13:11 UTC 2010
Modified Files:
src/usr.sbin/traceroute: traceroute.c
Log Message:
Fix incomplete extensions sanity checks
To generate a diff of this commit:
cvs rdiff -u -r1.74 -r1.75 src/usr.sbin/traceroute/traceroute.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/traceroute/traceroute.c
diff -u src/usr.sbin/traceroute/traceroute.c:1.74 src/usr.sbin/traceroute/traceroute.c:1.75
--- src/usr.sbin/traceroute/traceroute.c:1.74 Mon Jul 21 13:37:00 2008
+++ src/usr.sbin/traceroute/traceroute.c Fri Jul 2 12:13:11 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: traceroute.c,v 1.74 2008/07/21 13:37:00 lukem Exp $ */
+/* $NetBSD: traceroute.c,v 1.75 2010/07/02 12:13:11 kefren Exp $ */
/*
* Copyright (c) 1988, 1989, 1991, 1994, 1995, 1996, 1997
@@ -29,7 +29,7 @@
#else
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1991, 1994, 1995, 1996, 1997\
The Regents of the University of California. All rights reserved.");
-__RCSID("$NetBSD: traceroute.c,v 1.74 2008/07/21 13:37:00 lukem Exp $");
+__RCSID("$NetBSD: traceroute.c,v 1.75 2010/07/02 12:13:11 kefren Exp $");
#endif
#endif
@@ -1128,7 +1128,8 @@
ip = (struct ip *)buf;
- if (ip_len <= sizeof(struct ip) + ICMP_EXT_OFFSET) {
+ if (ip_len < (ip->ip_hl << 2) + ICMP_EXT_OFFSET +
+ sizeof(struct icmp_ext_cmn_hdr)) {
/*
* No support for ICMP extensions on this host
*/
@@ -1166,16 +1167,15 @@
buf += sizeof(*cmn_hdr);
datalen -= sizeof(*cmn_hdr);
- while (datalen > 0) {
+ while (datalen >= sizeof(struct icmp_ext_obj_hdr)) {
obj_hdr = (struct icmp_ext_obj_hdr *)buf;
obj_len = ntohs(obj_hdr->length);
/*
* Sanity check the length field
*/
- if (obj_len > datalen) {
+ if (obj_len > datalen)
return;
- }
datalen -= obj_len;