]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Update ND_BYTES_AVAILABLE_AFTER() macro for better accuracy
authorFrancois-Xavier Le Bail <[email protected]>
Mon, 5 Jun 2023 17:50:11 +0000 (19:50 +0200)
committerFrancois-Xavier Le Bail <[email protected]>
Tue, 13 Jun 2023 19:02:40 +0000 (21:02 +0200)
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)

netdissect.h
print-ascii.c

index e9fe9dffda045d21c20d0c9cca8a745d70b3abfe..b7aad4c119beeb146a045e76134178d60d7d84d6 100644 (file)
@@ -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) \
index a1dc4eb15ac08ddcc04e613a5dd2ccd621104788..230c40d6a0d117444695baf7e1421868ac4667bb 100644 (file)
@@ -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;