X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b8c56aa09228ee6c59af9bd2565bc66b69ac7943..11a7aeda39732ea8a889baf36678d73fc46a1aa1:/util-print.c diff --git a/util-print.c b/util-print.c index 5db042a3..7626c524 100644 --- a/util-print.c +++ b/util-print.c @@ -21,7 +21,7 @@ /* * txtproto_print() derived from original code by Hannes Gredler - * (hannes@juniper.net): + * (hannes@gredler.at): * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code @@ -86,7 +86,7 @@ fn_print_char(netdissect_options *ndo, u_char c) } /* - * Print out a null-terminated 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. * Stop at ep (if given) or before the null char, whichever is first. @@ -119,7 +119,7 @@ fn_print(netdissect_options *ndo, } /* - * Print out a null-terminated filename (or other ascii string) from + * Print out a null-terminated filename (or other ASCII string) from * a fixed-length buffer. * If ep is NULL, assume no truncation check is needed. * Return the number of bytes of string processed, including the @@ -169,7 +169,7 @@ fn_printztn(netdissect_options *ndo, } /* - * Print out a counted filename (or other ascii string). + * Print out a counted filename (or other ASCII string). * If ep is NULL, assume no truncation check is needed. * Return true if truncated. * Stop at ep (if given) or after n bytes, whichever is first. @@ -197,7 +197,7 @@ fn_printn(netdissect_options *ndo, } /* - * Print out a null-padded filename (or other ascii string). + * Print out a null-padded filename (or other ASCII string). * If ep is NULL, assume no truncation check is needed. * Return true if truncated. * Stop at ep (if given) or after n bytes or before the null char, @@ -498,6 +498,8 @@ tok2strbuf(register const struct tok *lp, register const char *fmt, /* * Convert a token value to a string; use "fmt" if not found. + * Uses tok2strbuf() on one of four local static buffers of size TOKBUFSIZE + * in round-robin fashion. */ const char * tok2str(register const struct tok *lp, register const char *fmt, @@ -521,8 +523,9 @@ static char * bittok2str_internal(register const struct tok *lp, register const char *fmt, register u_int v, const char *sep) { - static char buf[256]; /* our stringbuffer */ - int buflen=0; + static char buf[1024+1]; /* our string buffer */ + char *bufp = buf; + size_t space_left = sizeof(buf), string_size; register u_int rotbit; /* this is the bit we rotate through all bitpositions */ register u_int tokval; const char * sepstr = ""; @@ -537,8 +540,20 @@ bittok2str_internal(register const struct tok *lp, register const char *fmt, */ if (tokval == (v&rotbit)) { /* ok we have found something */ - buflen+=snprintf(buf+buflen, sizeof(buf)-buflen, "%s%s", - sepstr, lp->s); + if (space_left <= 1) + return (buf); /* only enough room left for NUL, if that */ + string_size = strlcpy(bufp, sepstr, space_left); + if (string_size >= space_left) + return (buf); /* we ran out of room */ + bufp += string_size; + space_left -= string_size; + if (space_left <= 1) + return (buf); /* only enough room left for NUL, if that */ + string_size = strlcpy(bufp, lp->s, space_left); + if (string_size >= space_left) + return (buf); /* we ran out of room */ + bufp += string_size; + space_left -= string_size; sepstr = sep; break; } @@ -547,7 +562,7 @@ bittok2str_internal(register const struct tok *lp, register const char *fmt, lp++; } - if (buflen == 0) + if (bufp == buf) /* bummer - lets print the "unknown" message as advised in the fmt string if we got one */ (void)snprintf(buf, sizeof(buf), fmt == NULL ? "#%08x" : fmt, v); return (buf); @@ -902,7 +917,7 @@ safeputs(netdissect_options *ndo, { u_int idx = 0; - while (*s && idx < maxlen) { + while (idx < maxlen && *s) { safeputchar(ndo, *s); idx++; s++;