From: Guy Harris Date: Sun, 5 Jul 2015 01:45:11 +0000 (-0700) Subject: Stop processing IPPROTO_ values once we hit IPPROTO_IPCOMP. X-Git-Tag: tcpdump-4.9.0-bp~82 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/406b0e3e9293a545c831ee9ed1558c3a5f5bd60d Stop processing IPPROTO_ values once we hit IPPROTO_IPCOMP. It's not like, for example, AH or ESP, where, following the header for that protocol, there's another protocol with its own payload. --- diff --git a/configure b/configure index 0a0dfdc1..03c69c58 100755 --- a/configure +++ b/configure @@ -5451,7 +5451,6 @@ fi - LBL_LIBS="$LIBS" pfopen=/usr/examples/packetfilter/pfopen.c if test -f $pfopen ; then diff --git a/configure.in b/configure.in index d7484ede..a78a1266 100644 --- a/configure.in +++ b/configure.in @@ -418,9 +418,6 @@ dnl Some platforms may need -lnsl for getrpcbynumber. AC_SEARCH_LIBS(getrpcbynumber, nsl, AC_DEFINE(HAVE_GETRPCBYNUMBER, 1, [define if you have getrpcbynumber()])) -dnl AC_CHECK_LIB(z, uncompress) -dnl AC_CHECK_HEADERS(zlib.h) - AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS) # diff --git a/netdissect.h b/netdissect.h index 3bba2cb1..ea77e74d 100644 --- a/netdissect.h +++ b/netdissect.h @@ -524,7 +524,7 @@ extern void ip6_print(netdissect_options *, const u_char *, u_int); extern void ipN_print(netdissect_options *, const u_char *, u_int); extern void ip_print(netdissect_options *, const u_char *, u_int); extern void ip_print_inner(netdissect_options *, const u_char *, u_int, u_int nh, const u_char *); -extern int ipcomp_print(netdissect_options *, register const u_char *, int *); +extern void ipcomp_print(netdissect_options *, register const u_char *); extern void ipx_netbios_print(netdissect_options *, const u_char *, u_int); extern void ipx_print(netdissect_options *, const u_char *, u_int); extern void isakmp_print(netdissect_options *, const u_char *, u_int, const u_char *); diff --git a/print-ip.c b/print-ip.c index 38cc2315..bb1554f9 100644 --- a/print-ip.c +++ b/print-ip.c @@ -358,14 +358,14 @@ again: case IPPROTO_IPCOMP: { - int enh; - ipds->advance = ipcomp_print(ndo, ipds->cp, &enh); - if (ipds->advance <= 0) - break; - ipds->cp += ipds->advance; - ipds->len -= ipds->advance; - ipds->nh = enh & 0xff; - goto again; + ipcomp_print(ndo, ipds->cp); + /* + * Either this has decompressed the payload and + * printed it, in which case there's nothing more + * to do, or it hasn't, in which case there's + * nothing more to do. + */ + break; } case IPPROTO_SCTP: diff --git a/print-ip6.c b/print-ip6.c index c5811300..2e1803f0 100644 --- a/print-ip6.c +++ b/print-ip6.c @@ -353,9 +353,14 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length) } case IPPROTO_IPCOMP: { - int enh; - advance = ipcomp_print(ndo, cp, &enh); - nh = enh & 0xff; + ipcomp_print(ndo, cp); + /* + * Either this has decompressed the payload and + * printed it, in which case there's nothing more + * to do, or it hasn't, in which case there's + * nothing more to do. + */ + advance = -1; break; } diff --git a/print-ipcomp.c b/print-ipcomp.c index 354eef35..291caa97 100644 --- a/print-ipcomp.c +++ b/print-ipcomp.c @@ -33,49 +33,37 @@ struct ipcomp { uint16_t comp_cpi; /* Compression parameter index */ }; -#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H) -#include -#endif - #include "netdissect.h" #include "extract.h" -int -ipcomp_print(netdissect_options *ndo, register const u_char *bp, int *nhdr _U_) +void +ipcomp_print(netdissect_options *ndo, register const u_char *bp) { register const struct ipcomp *ipcomp; uint16_t cpi; -#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H) - int advance; -#endif ipcomp = (const struct ipcomp *)bp; - ND_TCHECK(ipcomp->comp_cpi); + ND_TCHECK(*ipcomp); cpi = EXTRACT_16BITS(&ipcomp->comp_cpi); ND_PRINT((ndo, "IPComp(cpi=0x%04x)", cpi)); -#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H) - if (1) - goto fail; - /* - * We may want to decompress the packet here. Packet buffer - * management is a headache (if we decompress, packet will become - * larger). + * XXX - based on the CPI, we could decompress the packet here. + * Packet buffer management is a headache (if we decompress, + * packet will become larger). + * + * We would decompress the packet and then call a routine that, + * based on ipcomp->comp_nxt, dissects the decompressed data. + * + * Until we do that, however, we just return -1, so that + * the loop that processes "protocol"/"next header" types + * stops - there's nothing more it can do with a compressed + * payload. */ - if (nhdr) - *nhdr = ipcomp->comp_nxt; - advance = sizeof(struct ipcomp); + return; - ND_PRINT((ndo, ": ")); - return advance; - -#endif trunc: ND_PRINT((ndo, "[|IPCOMP]")); -#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H) -fail: -#endif - return -1; + return; }