From: Francois-Xavier Le Bail Date: Mon, 5 Jun 2023 17:50:11 +0000 (+0200) Subject: Update ND_BYTES_AVAILABLE_AFTER() macro for better accuracy X-Git-Tag: tcpdump-4.99.5~274 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/34de79d300ae4f0f2ec59ca9239c3b85192a7176 Update ND_BYTES_AVAILABLE_AFTER() macro for better accuracy With this change the number of bytes available in the captured data given by the macro is 0 when the argument is greater than or equal to ndo_snapend or less than ndo_packetp (e.g. pointer underflow). i.e.: If p is like p3, the macro gives 0. If p is like p1, the macro gives 0. |------------------|-----------------------|-----------------| p1 < ndo_packetp <= p2 < ndo_snapend <= p3 Update the ascii_print(), hex_and_ascii_print_with_offset() and hex_print_with_offset() functions accordingly. This is a follow-up to 07a7f33ba3ff346b9ce31772645a06980baca907. (cherry picked from commit 0d4083ee8687a9f6578e26a1407bd9f2a9d27885) --- diff --git a/netdissect.h b/netdissect.h index e9fe9dff..b7aad4c1 100644 --- a/netdissect.h +++ b/netdissect.h @@ -392,7 +392,7 @@ nd_trunc_longjmp(netdissect_options *ndo) * Number of bytes remaining in the captured data, starting at the * byte pointed to by the argument. */ -#define ND_BYTES_AVAILABLE_AFTER(p) ND_BYTES_BETWEEN((p), ndo->ndo_snapend) +#define ND_BYTES_AVAILABLE_AFTER(p) ((const u_char *)(p) < ndo->ndo_packetp ? 0 : ND_BYTES_BETWEEN((p), ndo->ndo_snapend)) /* Check length < minimum for invalid packet with a custom message, format %u */ #define ND_LCHECKMSG_U(length, minimum, what) \ diff --git a/print-ascii.c b/print-ascii.c index a1dc4eb1..230c40d6 100644 --- a/print-ascii.c +++ b/print-ascii.c @@ -67,7 +67,7 @@ ascii_print(netdissect_options *ndo, int truncated = FALSE; ndo->ndo_protocol = "ascii"; - caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0; + caplength = ND_BYTES_AVAILABLE_AFTER(cp); if (length > caplength) { length = caplength; truncated = TRUE; @@ -113,7 +113,7 @@ hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident, char hexstuff[HEXDUMP_SHORTS_PER_LINE*HEXDUMP_HEXSTUFF_PER_SHORT+1], *hsp; char asciistuff[ASCII_LINELENGTH+1], *asp; - caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0; + caplength = ND_BYTES_AVAILABLE_AFTER(cp); if (length > caplength) { length = caplength; truncated = TRUE; @@ -181,7 +181,7 @@ hex_print_with_offset(netdissect_options *ndo, u_int nshorts; int truncated = FALSE; - caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0; + caplength = ND_BYTES_AVAILABLE_AFTER(cp); if (length > caplength) { length = caplength; truncated = TRUE;