X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/1c05c2ce1d889dcee4bc4cf5b729018df88c8ad8..9da64383b97c7eb5e93a44eff5acf10ff991967e:/util.c diff --git a/util.c b/util.c index 47d7a136..571dd530 100644 --- a/util.c +++ b/util.c @@ -21,7 +21,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.95.2.1 2005-04-25 16:15:07 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.95.2.5 2005-06-16 01:19:57 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -45,7 +45,7 @@ static const char rcsid[] _U_ = #include "interface.h" /* - * Print out a filename (or other ascii string). + * Print out a null-terminated filename (or other ascii string). * If ep is NULL, assume no truncation check is needed. * Return true if truncated. */ @@ -104,6 +104,40 @@ fn_printn(register const u_char *s, register u_int n, return (n == 0) ? 0 : 1; } +/* + * Print out a null-padded filename (or other ascii string). + * If ep is NULL, assume no truncation check is needed. + * Return true if truncated. + */ +int +fn_printzp(register const u_char *s, register u_int n, + register const u_char *ep) +{ + register int ret; + register u_char c; + + ret = 1; /* assume truncated */ + while (n > 0 && (ep == NULL || s < ep)) { + n--; + c = *s++; + if (c == '\0') { + ret = 0; + break; + } + if (!isascii(c)) { + c = toascii(c); + putchar('M'); + putchar('-'); + } + if (!isprint(c)) { + c ^= 0x40; /* DEL to ?, others to alpha */ + putchar('^'); + } + putchar(c); + } + return (n == 0) ? 0 : ret; +} + /* * Print the timestamp */ @@ -208,6 +242,18 @@ relts_print(int secs) int print_unknown_data(const u_char *cp,const char *ident,int len) { + if (len < 0) { + printf("%sDissector error: print_unknown_data called with negative length", + ident); + return(0); + } + if (snapend - cp < len) + len = snapend - cp; + if (len < 0) { + printf("%sDissector error: print_unknown_data called with pointer past end of packet", + ident); + return(0); + } hex_print(ident,cp,len); return(1); /* everything is ok */ }