X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/a8bba6ff8e20736ea89ecf3f1bfb83b9b30ea20a..032d569e681df53b6e0b03fc20bdb1970faafa20:/print-ascii.c diff --git a/print-ascii.c b/print-ascii.c index e5b7a582..b4789435 100644 --- a/print-ascii.c +++ b/print-ascii.c @@ -64,11 +64,14 @@ ascii_print(netdissect_options *ndo, { 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); @@ -94,22 +97,27 @@ ascii_print(netdissect_options *ndo, ND_PRINT("%c", s); } } + if (truncated) + nd_trunc_longjmp(ndo); } static void -hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident, +hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *indent, const u_char *cp, u_int length, u_int oset) { u_int caplength; 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; @@ -127,7 +135,7 @@ hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident, if (i >= HEXDUMP_SHORTS_PER_LINE) { *hsp = *asp = '\0'; ND_PRINT("%s0x%04x: %-*s %s", - ident, oset, HEXDUMP_HEXSTUFF_PER_LINE, + indent, oset, HEXDUMP_HEXSTUFF_PER_LINE, hexstuff, asciistuff); i = 0; hsp = hexstuff; asp = asciistuff; oset += HEXDUMP_BYTES_PER_LINE; @@ -146,16 +154,18 @@ hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident, if (i > 0) { *hsp = *asp = '\0'; ND_PRINT("%s0x%04x: %-*s %s", - ident, oset, HEXDUMP_HEXSTUFF_PER_LINE, + indent, oset, HEXDUMP_HEXSTUFF_PER_LINE, hexstuff, asciistuff); } + if (truncated) + nd_trunc_longjmp(ndo); } void -hex_and_ascii_print(netdissect_options *ndo, const char *ident, +hex_and_ascii_print(netdissect_options *ndo, const char *indent, const u_char *cp, u_int length) { - hex_and_ascii_print_with_offset(ndo, ident, cp, length, 0); + hex_and_ascii_print_with_offset(ndo, indent, cp, length, 0); } /* @@ -163,21 +173,24 @@ hex_and_ascii_print(netdissect_options *ndo, const char *ident, */ void hex_print_with_offset(netdissect_options *ndo, - const char *ident, const u_char *cp, u_int length, + const char *indent, const u_char *cp, u_int length, u_int oset) { 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) { if ((i++ % 8) == 0) { - ND_PRINT("%s0x%04x: ", ident, oset); + ND_PRINT("%s0x%04x: ", indent, oset); oset += HEXDUMP_BYTES_PER_LINE; } s = GET_U_1(cp); @@ -188,18 +201,18 @@ hex_print_with_offset(netdissect_options *ndo, } if (length & 1) { if ((i % 8) == 0) - ND_PRINT("%s0x%04x: ", ident, oset); + ND_PRINT("%s0x%04x: ", indent, 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 *indent, const u_char *cp, u_int length) { - hex_print_with_offset(ndo, ident, cp, length, 0); + hex_print_with_offset(ndo, indent, cp, length, 0); } #ifdef MAIN