X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/4aac37f04316b37b73b99bdcdbfa97347bb2fe51..5ee4e508deb94d0a8a0268cd72fd66dcfc680eb5:/print-ascii.c diff --git a/print-ascii.c b/print-ascii.c index 237cf636..2f5fe854 100644 --- a/print-ascii.c +++ b/print-ascii.c @@ -58,19 +58,20 @@ #define HEXDUMP_HEXSTUFF_PER_LINE \ (HEXDUMP_HEXSTUFF_PER_SHORT * HEXDUMP_SHORTS_PER_LINE) -static void hex_and_ascii_print_with_offset(netdissect_options *, const char *, const u_char *, u_int, u_int); - void ascii_print(netdissect_options *ndo, const u_char *cp, u_int length) { u_int caplength; u_char s; + int truncated = FALSE; ndo->ndo_protocol = "ascii"; caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0; - if (length > caplength) + if (length > caplength) { length = caplength; + truncated = TRUE; + } ND_PRINT("\n"); while (length > 0) { s = GET_U_1(cp); @@ -96,6 +97,8 @@ ascii_print(netdissect_options *ndo, ND_PRINT("%c", s); } } + if (truncated) + nd_trunc_longjmp(ndo); } static void @@ -106,12 +109,15 @@ hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident, u_int i; u_int s1, s2; u_int nshorts; + int truncated = FALSE; 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; - if (length > caplength) + if (length > caplength) { length = caplength; + truncated = TRUE; + } nshorts = length / sizeof(u_short); i = 0; hsp = hexstuff; asp = asciistuff; @@ -151,6 +157,8 @@ hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident, ident, oset, HEXDUMP_HEXSTUFF_PER_LINE, hexstuff, asciistuff); } + if (truncated) + nd_trunc_longjmp(ndo); } void @@ -171,10 +179,13 @@ hex_print_with_offset(netdissect_options *ndo, u_int caplength; u_int i, s; u_int nshorts; + int truncated = FALSE; caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0; - if (length > caplength) + if (length > caplength) { length = caplength; + truncated = TRUE; + } nshorts = length / sizeof(u_short); i = 0; while (nshorts != 0) { @@ -193,15 +204,15 @@ hex_print_with_offset(netdissect_options *ndo, ND_PRINT("%s0x%04x: ", ident, oset); ND_PRINT(" %02x", GET_U_1(cp)); } + if (truncated) + nd_trunc_longjmp(ndo); } -/* - * just for completeness - */ void -hex_print(netdissect_options *ndo,const char *ident, const u_char *cp, u_int length) +hex_print(netdissect_options *ndo, + const char *ident, const u_char *cp, u_int length) { - hex_print_with_offset(ndo, ident, cp, length, 0); + hex_print_with_offset(ndo, ident, cp, length, 0); } #ifdef MAIN