sbin/ipfw: Fix null pointer deference when printing counters

ipfw -[tT] prints statistics of the last access. If the rule was never
used, the counter might be not exist.  This happens unconditionally on
inserting a new rule.  Avoid printing statistics in this case.

PR:	255491
Reported by:	Haisheng Zhouz
Reviewed by:	ae
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D30046
This commit is contained in:
Lutz Donnerhacke 2021-04-30 16:12:47 +02:00
parent f6b6d216ca
commit bf7cc0f9cb

View File

@ -2174,32 +2174,35 @@ show_static_rule(struct cmdline_opts *co, struct format_opts *fo,
}
bprintf(bp, "%05u ", rule->rulenum);
/* Print counters if enabled */
if (fo->pcwidth > 0 || fo->bcwidth > 0) {
pr_u64(bp, &cntr->pcnt, fo->pcwidth);
pr_u64(bp, &cntr->bcnt, fo->bcwidth);
}
/* Print timestamp */
if (co->do_time == TIMESTAMP_NUMERIC)
bprintf(bp, "%10u ", cntr->timestamp);
else if (co->do_time == TIMESTAMP_STRING) {
char timestr[30];
time_t t = (time_t)0;
if (twidth == 0) {
strcpy(timestr, ctime(&t));
*strchr(timestr, '\n') = '\0';
twidth = strlen(timestr);
/* only if counters are available */
if (cntr != NULL) {
/* Print counters if enabled */
if (fo->pcwidth > 0 || fo->bcwidth > 0) {
pr_u64(bp, &cntr->pcnt, fo->pcwidth);
pr_u64(bp, &cntr->bcnt, fo->bcwidth);
}
if (cntr->timestamp > 0) {
t = _long_to_time(cntr->timestamp);
strcpy(timestr, ctime(&t));
*strchr(timestr, '\n') = '\0';
bprintf(bp, "%s ", timestr);
} else {
bprintf(bp, "%*s ", twidth, "");
/* Print timestamp */
if (co->do_time == TIMESTAMP_NUMERIC)
bprintf(bp, "%10u ", cntr->timestamp);
else if (co->do_time == TIMESTAMP_STRING) {
char timestr[30];
time_t t = (time_t)0;
if (twidth == 0) {
strcpy(timestr, ctime(&t));
*strchr(timestr, '\n') = '\0';
twidth = strlen(timestr);
}
if (cntr->timestamp > 0) {
t = _long_to_time(cntr->timestamp);
strcpy(timestr, ctime(&t));
*strchr(timestr, '\n') = '\0';
bprintf(bp, "%s ", timestr);
} else {
bprintf(bp, "%*s ", twidth, "");
}
}
}