Avoid duplicating warnings when reading table

Invalid lines in a file was the one case that would not suppress future
warnings. Just make it suppress warnings too, but clear that suppression
if there is a field in between that doesn't error.

Fixes #3692
This commit is contained in:
Evan Typanski 2024-09-24 11:03:20 -04:00
parent 54391f50d9
commit 6e8d43a552
3 changed files with 61 additions and 5 deletions

View file

@ -6,7 +6,6 @@
#include <sys/types.h>
#include <unistd.h>
#include <cerrno>
#include <sstream>
#include "zeek/input/readers/ascii/ascii.bif.h"
#include "zeek/threading/SerialTypes.h"
@ -345,7 +344,8 @@ bool Ascii::DoUpdate() {
FailWarn(fail_on_invalid_lines,
Fmt("Not enough fields in line '%s' of %s. Found "
"%d fields, want positions %d and %d",
line.c_str(), fname.c_str(), pos, fit.position, fit.secondary_position));
line.c_str(), fname.c_str(), pos, fit.position, fit.secondary_position),
! fail_on_invalid_lines);
if ( fail_on_invalid_lines ) {
for ( int i = 0; i < fpos; i++ )
@ -374,8 +374,6 @@ bool Ascii::DoUpdate() {
if ( fit.secondary_position != -1 ) {
// we have a port definition :)
assert(val->type == TYPE_PORT);
// Error(Fmt("Got type %d != PORT with secondary position!", val->type));
val->val.port_val.proto = formatter->ParseProto(stringfields[fit.secondary_position]);
}
@ -395,8 +393,10 @@ bool Ascii::DoUpdate() {
delete[] fields;
continue;
}
// If there's no error, then it makes sense to report the next error.
else
StopWarningSuppression();
// printf("fpos: %d, second.num_fields: %d\n", fpos, (*it).second.num_fields);
assert(fpos == NumFields());
if ( Info().mode == MODE_STREAM )
@ -408,6 +408,7 @@ bool Ascii::DoUpdate() {
if ( Info().mode != MODE_STREAM )
EndCurrentSend();
StopWarningSuppression();
return true;
}