mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 16:48:19 +00:00
Skip negative integers in input framework where not type-permissible
Script-layer counts, when provided as negative integers in an input file, got cast to unsigned values because strtoull() does not complain about negative values. For example, input string "-1" would lead to value 18446744073709551615 (an all-ones 64-bit int) on x86_64. This is more likely to be an error than an intent to get very large, platform-dependent values, so these input lines are now skipped with according messaging in the reporter.log/stderr. This also affected ports: -1/tcp got cast to unsigned and only thrown out because PortVal rejects values > 65535, mapping them to 0. We now skip such inputs as well. Updates existing input framework tests to capture the new behavior.
This commit is contained in:
parent
d845f01b27
commit
38d6b6a98b
7 changed files with 25 additions and 7 deletions
|
@ -261,7 +261,7 @@ Value* Ascii::ParseValue(const string& s, const string& name, TypeTag type, Type
|
|||
|
||||
case TYPE_COUNT:
|
||||
val->val.uint_val = strtoull(start, &end, 10);
|
||||
if ( CheckNumberError(start, end) )
|
||||
if ( CheckNumberError(start, end, true) )
|
||||
goto parse_error;
|
||||
break;
|
||||
|
||||
|
@ -292,7 +292,7 @@ Value* Ascii::ParseValue(const string& s, const string& name, TypeTag type, Type
|
|||
start = numberpart.c_str();
|
||||
}
|
||||
val->val.port_val.port = strtoull(start, &end, 10);
|
||||
if ( CheckNumberError(start, end) )
|
||||
if ( CheckNumberError(start, end, true) )
|
||||
goto parse_error;
|
||||
}
|
||||
break;
|
||||
|
@ -473,7 +473,7 @@ parse_error:
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
bool Ascii::CheckNumberError(const char* start, const char* end) const
|
||||
bool Ascii::CheckNumberError(const char* start, const char* end, bool nonneg_only) const
|
||||
{
|
||||
MsgThread* thread = GetThread();
|
||||
|
||||
|
@ -491,6 +491,18 @@ bool Ascii::CheckNumberError(const char* start, const char* end) const
|
|||
if ( (*end != '\0') )
|
||||
thread->Warning(thread->Fmt("Number '%s' contained non-numeric trailing characters. Ignored trailing characters '%s'", start, end));
|
||||
|
||||
if ( nonneg_only ) {
|
||||
// String may legitimately start with whitespace, so
|
||||
// we skip this before checking for a minus sign.
|
||||
const char* s = start;
|
||||
while ( s < end && isspace(*s) )
|
||||
s++;
|
||||
if ( *s == '-' ) {
|
||||
thread->Warning(thread->Fmt("Number '%s' cannot be negative", start));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( errno == EINVAL )
|
||||
{
|
||||
thread->Warning(thread->Fmt("String '%s' could not be converted to a number", start));
|
||||
|
|
|
@ -54,7 +54,7 @@ public:
|
|||
TypeTag type, TypeTag subtype = TYPE_ERROR) const;
|
||||
|
||||
private:
|
||||
bool CheckNumberError(const char* start, const char* end) const;
|
||||
bool CheckNumberError(const char* start, const char* end, bool nonneg_only = false) const;
|
||||
|
||||
SeparatorInfo separators;
|
||||
};
|
||||
|
|
|
@ -5,5 +5,7 @@ warning: ..<...>/Input::READER_ASCII: Number '9223372036854775801TEXTHERE' conta
|
|||
warning: ..<...>/Input::READER_ASCII: Number '1Justtext' contained non-numeric trailing characters. Ignored trailing characters 'Justtext'
|
||||
warning: ..<...>/Input::READER_ASCII: String 'Justtext' contained no parseable number
|
||||
warning: ..<...>/Input::READER_ASCII: Could not convert line 'Justtext 1' of ../input.log to Val. Ignoring line.
|
||||
warning: ..<...>/Input::READER_ASCII: Number ' -18446744073709551612' cannot be negative
|
||||
warning: ..<...>/Input::READER_ASCII: Could not convert line '9223372036854775800 -18446744073709551612' of ../input.log to Val. Ignoring line.
|
||||
received termination signal
|
||||
>>>
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
|
||||
{
|
||||
[9223372036854775801] = [c=1],
|
||||
[9223372036854775800] = [c=4]
|
||||
[9223372036854775801] = [c=1]
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
|
||||
warning: ../input.log/Input::READER_ASCII: Port '50/trash' contained unknown protocol 'trash'
|
||||
warning: ../input.log/Input::READER_ASCII: Number '-1' cannot be negative
|
||||
warning: ../input.log/Input::READER_ASCII: Could not convert line '1.2.3.8 -1/tcp' of ../input.log to Val. Ignoring line.
|
||||
received termination signal
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
# @TEST-EXEC: sed 1d .stderr > .stderrwithoutfirstline
|
||||
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff .stderrwithoutfirstline
|
||||
|
||||
# Note the tab+space separator in the last line of the following is
|
||||
# intentional. It verifies our whitespace handling.
|
||||
@TEST-START-FILE input.log
|
||||
#separator \x09
|
||||
#fields i c
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
1.2.3.5 52/udp
|
||||
1.2.3.6 30/unknown
|
||||
1.2.3.7 50/trash
|
||||
1.2.3.8 -1/tcp
|
||||
@TEST-END-FILE
|
||||
|
||||
redef exit_only_after_terminate = T;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue