svn commit: r277982 - head/contrib/tcpdump

Pedro F. Giffuni pfg at FreeBSD.org
Sat Jan 31 16:34:40 UTC 2015


Author: pfg
Date: Sat Jan 31 16:34:39 2015
New Revision: 277982
URL: https://svnweb.freebsd.org/changeset/base/277982

Log:
  MFV	r277981:
  Upstream fixes for issues found with afl (Issue #417).
  
  - Fix length checking.
  
  Check both the captured length and the on-the-wire length (the latter
  *should* be greater than or equal to the former, but that's not
  guaranteed).
  
  Add some additional length checks, so neither caplen nor length
  underflow.
  
  If we stop dissecting because the packet is too short, return 1, not 0,
  as we've "dissected" what we can; 0 means "this is LLC+SNAP with an OUI
  of 0 and an unknown Ethertype".
  
  commit:	743bcecdc92f88b118ec7aac4f68b606601205cc
  
  - Clean up length checks.
  
  Check only the amount of length that matters at any given point; yes,
  this means we do multiple checks, but so it goes.
  
  We don't need to check for LLC+SNAP - llc_print() does that for us.  We
  do, however, need to check to make sure we can safely skip the Fore
  header.
  
  commit:	5c65e7532fa16308e01299988852b0dc5b027559

Modified:
  head/contrib/tcpdump/print-atm.c
  head/contrib/tcpdump/print-llc.c
Directory Properties:
  head/contrib/tcpdump/   (props changed)

Modified: head/contrib/tcpdump/print-atm.c
==============================================================================
--- head/contrib/tcpdump/print-atm.c	Sat Jan 31 16:26:21 2015	(r277981)
+++ head/contrib/tcpdump/print-atm.c	Sat Jan 31 16:34:39 2015	(r277982)
@@ -167,7 +167,7 @@ atm_if_print(netdissect_options *ndo,
 	uint32_t llchdr;
 	u_int hdrlen = 0;
 
-	if (caplen < 8) {
+	if (caplen < 1 || length < 1) {
 		ND_PRINT((ndo, "%s", tstr));
 		return (caplen);
 	}
@@ -181,6 +181,15 @@ atm_if_print(netdissect_options *ndo,
         }
 
 	/*
+	 * Must have at least a DSAP, an SSAP, and the first byte of the
+	 * control field.
+	 */
+	if (caplen < 3 || length < 3) {
+		ND_PRINT((ndo, "%s", tstr));
+		return (caplen);
+	}
+
+	/*
 	 * Extract the presumed LLC header into a variable, for quick
 	 * testing.
 	 * Then check for a header that's neither a header for a SNAP
@@ -207,6 +216,10 @@ atm_if_print(netdissect_options *ndo,
 		 * packets?  If so, could it be changed to use a
 		 * new DLT_IEEE802_6 value if we added it?
 		 */
+		if (caplen < 20 || length < 20) {
+			ND_PRINT((ndo, "%s", tstr));
+			return (caplen);
+		}
 		if (ndo->ndo_eflag)
 			ND_PRINT((ndo, "%08x%08x %08x%08x ",
 			       EXTRACT_32BITS(p),

Modified: head/contrib/tcpdump/print-llc.c
==============================================================================
--- head/contrib/tcpdump/print-llc.c	Sat Jan 31 16:26:21 2015	(r277981)
+++ head/contrib/tcpdump/print-llc.c	Sat Jan 31 16:34:39 2015	(r277982)
@@ -153,10 +153,10 @@ llc_print(netdissect_options *ndo, const
 
 	*extracted_ethertype = 0;
 
-	if (caplen < 3) {
+	if (caplen < 3 || length < 3) {
 		ND_PRINT((ndo, "[|llc]"));
 		ND_DEFAULTPRINT((u_char *)p, caplen);
-		return(0);
+		return (1);
 	}
 
 	dsap_field = *p;
@@ -179,10 +179,10 @@ llc_print(netdissect_options *ndo, const
 		 * The control field in I and S frames is
 		 * 2 bytes...
 		 */
-		if (caplen < 4) {
+		if (caplen < 4 || length < 4) {
 			ND_PRINT((ndo, "[|llc]"));
 			ND_DEFAULTPRINT((u_char *)p, caplen);
-			return(0);
+			return (1);
 		}
 
 		/*
@@ -242,6 +242,11 @@ llc_print(netdissect_options *ndo, const
 
 	if (ssap == LLCSAP_IP && dsap == LLCSAP_IP &&
 	    control == LLC_UI) {
+		if (caplen < 4 || length < 4) {
+			ND_PRINT((ndo, "[|llc]"));
+			ND_DEFAULTPRINT((u_char *)p, caplen);
+			return (1);
+		}
 		ip_print(ndo, p+4, length-4);
 		return (1);
 	}
@@ -370,6 +375,8 @@ snap_print(netdissect_options *ndo, cons
 	register int ret;
 
 	ND_TCHECK2(*p, 5);
+	if (caplen < 5 || length < 5)
+		goto trunc;
 	orgcode = EXTRACT_24BITS(p);
 	et = EXTRACT_16BITS(p + 3);
 


More information about the svn-src-all mailing list