Upgrade tcpdump to tcpdump-4.99.1

Test: make
Change-Id: I052ed8f5279c806e4d2ff925f581b71db3ac03c0
diff --git a/print-pktap.c b/print-pktap.c
index 4a295fd..05ce5f9 100644
--- a/print-pktap.c
+++ b/print-pktap.c
@@ -22,11 +22,12 @@
 /* \summary: Apple's DLT_PKTAP printer */
 
 #ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
 #endif
 
-#include <netdissect-stdinc.h>
+#include "netdissect-stdinc.h"
 
+#define ND_LONGJMP_FROM_TCHECK
 #include "netdissect.h"
 #include "extract.h"
 
@@ -44,20 +45,20 @@
  * to host byte order in libpcap.
  */
 typedef struct pktap_header {
-	uint32_t	pkt_len;	/* length of pktap header */
-	uint32_t	pkt_rectype;	/* type of record */
-	uint32_t	pkt_dlt;	/* DLT type of this packet */
+	nd_uint32_t	pkt_len;	/* length of pktap header */
+	nd_uint32_t	pkt_rectype;	/* type of record */
+	nd_uint32_t	pkt_dlt;	/* DLT type of this packet */
 	char		pkt_ifname[24];	/* interface name */
-	uint32_t	pkt_flags;
-	uint32_t	pkt_pfamily;	/* "protocol family" */
-	uint32_t	pkt_llhdrlen;	/* link-layer header length? */
-	uint32_t	pkt_lltrlrlen;	/* link-layer trailer length? */
-	uint32_t	pkt_pid;	/* process ID */
+	nd_uint32_t	pkt_flags;
+	nd_uint32_t	pkt_pfamily;	/* "protocol family" */
+	nd_uint32_t	pkt_llhdrlen;	/* link-layer header length? */
+	nd_uint32_t	pkt_lltrlrlen;	/* link-layer trailer length? */
+	nd_uint32_t	pkt_pid;	/* process ID */
 	char		pkt_cmdname[20]; /* command name */
-	uint32_t	pkt_svc_class;	/* "service class" */
-	uint16_t	pkt_iftype;	/* "interface type" */
-	uint16_t	pkt_ifunit;	/* unit number of interface? */
-	uint32_t	pkt_epid;	/* "effective process ID" */
+	nd_uint32_t	pkt_svc_class;	/* "service class" */
+	nd_uint16_t	pkt_iftype;	/* "interface type" */
+	nd_uint16_t	pkt_ifunit;	/* unit number of interface? */
+	nd_uint32_t	pkt_epid;	/* "effective process ID" */
 	char		pkt_ecmdname[20]; /* "effective command name" */
 } pktap_header_t;
 
@@ -67,7 +68,7 @@
 #define PKT_REC_NONE	0	/* nothing follows the header */
 #define PKT_REC_PACKET	1	/* a packet follows the header */
 
-static inline void
+static void
 pktap_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
 {
 	const pktap_header_t *hdr;
@@ -76,17 +77,17 @@
 
 	hdr = (const pktap_header_t *)bp;
 
-	dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
-	hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+	dlt = GET_LE_U_4(hdr->pkt_dlt);
+	hdrlen = GET_LE_U_4(hdr->pkt_len);
 	dltname = pcap_datalink_val_to_name(dlt);
 	if (!ndo->ndo_qflag) {
-		ND_PRINT((ndo,"DLT %s (%d) len %d",
-			  (dltname != NULL ? dltname : "UNKNOWN"), dlt, hdrlen));
+		ND_PRINT("DLT %s (%u) len %u",
+			  (dltname != NULL ? dltname : "UNKNOWN"), dlt, hdrlen);
         } else {
-		ND_PRINT((ndo,"%s", (dltname != NULL ? dltname : "UNKNOWN")));
+		ND_PRINT("%s", (dltname != NULL ? dltname : "UNKNOWN"));
         }
 
-	ND_PRINT((ndo, ", length %u: ", length));
+	ND_PRINT(", length %u: ", length);
 }
 
 /*
@@ -95,7 +96,7 @@
  * 'h->len' is the length of the packet off the wire, and 'h->caplen'
  * is the number of bytes actually captured.
  */
-u_int
+void
 pktap_if_print(netdissect_options *ndo,
                const struct pcap_pkthdr *h, const u_char *p)
 {
@@ -106,13 +107,15 @@
 	const pktap_header_t *hdr;
 	struct pcap_pkthdr nhdr;
 
-	if (caplen < sizeof(pktap_header_t) || length < sizeof(pktap_header_t)) {
-		ND_PRINT((ndo, "[|pktap]"));
-		return (0);
+	ndo->ndo_protocol = "pktap";
+	if (length < sizeof(pktap_header_t)) {
+		ND_PRINT(" (packet too short, %u < %zu)",
+		         length, sizeof(pktap_header_t));
+		goto invalid;
 	}
 	hdr = (const pktap_header_t *)p;
-	dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
-	hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+	dlt = GET_LE_U_4(hdr->pkt_dlt);
+	hdrlen = GET_LE_U_4(hdr->pkt_len);
 	if (hdrlen < sizeof(pktap_header_t)) {
 		/*
 		 * Claimed header length < structure length.
@@ -121,13 +124,16 @@
 		 * is the length supplied so that the header can
 		 * be expanded in the future)?
 		 */
-		ND_PRINT((ndo, "[|pktap]"));
-		return (0);
+		ND_PRINT(" (pkt_len too small, %u < %zu)",
+		         hdrlen, sizeof(pktap_header_t));
+		goto invalid;
 	}
-	if (caplen < hdrlen || length < hdrlen) {
-		ND_PRINT((ndo, "[|pktap]"));
-		return (hdrlen);
+	if (hdrlen > length) {
+		ND_PRINT(" (pkt_len too big, %u > %u)",
+		         hdrlen, length);
+		goto invalid;
 	}
+	ND_TCHECK_LEN(p, hdrlen);
 
 	if (ndo->ndo_eflag)
 		pktap_header_print(ndo, p, length);
@@ -136,19 +142,21 @@
 	caplen -= hdrlen;
 	p += hdrlen;
 
-	rectype = EXTRACT_LE_32BITS(&hdr->pkt_rectype);
+	rectype = GET_LE_U_4(hdr->pkt_rectype);
 	switch (rectype) {
 
 	case PKT_REC_NONE:
-		ND_PRINT((ndo, "no data"));
+		ND_PRINT("no data");
 		break;
 
 	case PKT_REC_PACKET:
-		if ((printer = lookup_printer(dlt)) != NULL) {
+		printer = lookup_printer(dlt);
+		if (printer != NULL) {
 			nhdr = *h;
 			nhdr.caplen = caplen;
 			nhdr.len = length;
-			hdrlen += printer(ndo, &nhdr, p);
+			printer(ndo, &nhdr, p);
+			hdrlen += ndo->ndo_ll_hdr_len;
 		} else {
 			if (!ndo->ndo_eflag)
 				pktap_header_print(ndo, (const u_char *)hdr,
@@ -160,14 +168,10 @@
 		break;
 	}
 
-	return (hdrlen);
+	ndo->ndo_ll_hdr_len += hdrlen;
+	return;
+
+invalid:
+	nd_print_invalid(ndo);
 }
-
-/*
- * Local Variables:
- * c-style: whitesmith
- * c-basic-offset: 8
- * End:
- */
-
 #endif /* DLT_PKTAP */