X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/abc8c2d61c65757011d9d32abb01cd1e51232f3a..refs/heads/coverity_scan:/print-syslog.c diff --git a/print-syslog.c b/print-syslog.c index a3b56ce4..396f07a4 100644 --- a/print-syslog.c +++ b/print-syslog.c @@ -15,10 +15,9 @@ */ /* \summary: Syslog protocol printer */ +/* specification: RFC 3164 (not RFC 5424) */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" @@ -90,29 +89,25 @@ syslog_print(netdissect_options *ndo, * severity and facility values */ - if (GET_U_1(pptr) == '<') { - msg_off++; - while (msg_off <= SYSLOG_MAX_DIGITS && - GET_U_1(pptr + msg_off) >= '0' && - GET_U_1(pptr + msg_off) <= '9') { - pri = pri * 10 + (GET_U_1(pptr + msg_off) - '0'); - msg_off++; - } - if (GET_U_1(pptr + msg_off) != '>') { - nd_print_trunc(ndo); - return; - } + if (GET_U_1(pptr) != '<') + goto invalid; + msg_off++; + + while (msg_off <= SYSLOG_MAX_DIGITS && + GET_U_1(pptr + msg_off) >= '0' && + GET_U_1(pptr + msg_off) <= '9') { + pri = pri * 10 + (GET_U_1(pptr + msg_off) - '0'); msg_off++; - } else { - nd_print_trunc(ndo); - return; } + if (GET_U_1(pptr + msg_off) != '>') + goto invalid; + msg_off++; + facility = (pri & SYSLOG_FACILITY_MASK) >> 3; severity = pri & SYSLOG_SEVERITY_MASK; - if (ndo->ndo_vflag < 1 ) - { + if (ndo->ndo_vflag < 1 ) { ND_PRINT("SYSLOG %s.%s, length: %u", tok2str(syslog_facility_values, "unknown (%u)", facility), tok2str(syslog_severity_values, "unknown (%u)", severity), @@ -128,10 +123,25 @@ syslog_print(netdissect_options *ndo, severity); /* print the syslog text in verbose mode */ - for (; msg_off < len; msg_off++) { - fn_print_char(ndo, GET_U_1(pptr + msg_off)); - } + /* + * RFC 3164 Section 4.1.3: "There is no ending delimiter to this part. + * The MSG part of the syslog packet MUST contain visible (printing) + * characters." + * + * RFC 5424 Section 8.2: "This document does not impose any mandatory + * restrictions on the MSG or PARAM-VALUE content. As such, they MAY + * contain control characters, including the NUL character." + * + * Hence, to aid in protocol debugging, print the full MSG without + * beautification to make it clear what was transmitted on the wire. + */ + if (len > msg_off) + nd_printjn(ndo, pptr + msg_off, len - msg_off); if (ndo->ndo_vflag > 1) print_unknown_data(ndo, pptr, "\n\t", len); + return; + +invalid: + nd_print_invalid(ndo); }