mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
GH-208: change invalid subnet expressions to a runtime error
Rather than abort.
This commit is contained in:
parent
67484a90fa
commit
01a8418d79
4 changed files with 65 additions and 11 deletions
15
src/Expr.cc
15
src/Expr.cc
|
@ -1795,7 +1795,20 @@ Val* DivideExpr::AddrFold(Val* v1, Val* v2) const
|
||||||
else
|
else
|
||||||
mask = static_cast<uint32>(v2->InternalInt());
|
mask = static_cast<uint32>(v2->InternalInt());
|
||||||
|
|
||||||
return new SubNetVal(v1->AsAddr(), mask);
|
auto& a = v1->AsAddr();
|
||||||
|
|
||||||
|
if ( a.GetFamily() == IPv4 )
|
||||||
|
{
|
||||||
|
if ( mask > 32 )
|
||||||
|
RuntimeError(fmt("bad IPv4 subnet prefix length: %" PRIu32, mask));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( mask > 128 )
|
||||||
|
RuntimeError(fmt("bad IPv6 subnet prefix length: %" PRIu32, mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SubNetVal(a, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
IMPLEMENT_SERIAL(DivideExpr, SER_DIVIDE_EXPR);
|
IMPLEMENT_SERIAL(DivideExpr, SER_DIVIDE_EXPR);
|
||||||
|
|
|
@ -216,7 +216,10 @@ IPPrefix::IPPrefix(const in4_addr& in4, uint8_t length)
|
||||||
: prefix(in4), length(96 + length)
|
: prefix(in4), length(96 + length)
|
||||||
{
|
{
|
||||||
if ( length > 32 )
|
if ( length > 32 )
|
||||||
reporter->InternalError("Bad in4_addr IPPrefix length : %d", length);
|
{
|
||||||
|
reporter->Error("Bad in4_addr IPPrefix length : %d", length);
|
||||||
|
this->length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
prefix.Mask(this->length);
|
prefix.Mask(this->length);
|
||||||
}
|
}
|
||||||
|
@ -225,7 +228,10 @@ IPPrefix::IPPrefix(const in6_addr& in6, uint8_t length)
|
||||||
: prefix(in6), length(length)
|
: prefix(in6), length(length)
|
||||||
{
|
{
|
||||||
if ( length > 128 )
|
if ( length > 128 )
|
||||||
reporter->InternalError("Bad in6_addr IPPrefix length : %d", length);
|
{
|
||||||
|
reporter->Error("Bad in6_addr IPPrefix length : %d", length);
|
||||||
|
this->length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
prefix.Mask(this->length);
|
prefix.Mask(this->length);
|
||||||
}
|
}
|
||||||
|
@ -236,19 +242,23 @@ IPPrefix::IPPrefix(const IPAddr& addr, uint8_t length, bool len_is_v6_relative)
|
||||||
if ( prefix.GetFamily() == IPv4 && ! len_is_v6_relative )
|
if ( prefix.GetFamily() == IPv4 && ! len_is_v6_relative )
|
||||||
{
|
{
|
||||||
if ( length > 32 )
|
if ( length > 32 )
|
||||||
reporter->InternalError("Bad IPAddr(v4) IPPrefix length : %d",
|
{
|
||||||
length);
|
reporter->Error("Bad IPAddr(v4) IPPrefix length : %d", length);
|
||||||
|
this->length = 0;
|
||||||
this->length = length + 96;
|
}
|
||||||
|
else
|
||||||
|
this->length = length + 96;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( length > 128 )
|
if ( length > 128 )
|
||||||
reporter->InternalError("Bad IPAddr(v6) IPPrefix length : %d",
|
{
|
||||||
length);
|
reporter->Error("Bad IPAddr(v6) IPPrefix length : %d", length);
|
||||||
|
this->length = 0;
|
||||||
this->length = length;
|
}
|
||||||
|
else
|
||||||
|
this->length = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
prefix.Mask(this->length);
|
prefix.Mask(this->length);
|
||||||
|
|
5
testing/btest/Baseline/language.subnet-errors/out
Normal file
5
testing/btest/Baseline/language.subnet-errors/out
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
expression error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.subnet-errors/subnet-errors.bro, line 9: bad IPv4 subnet prefix length: 33 (1.2.3.4 / i)
|
||||||
|
expression error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.subnet-errors/subnet-errors.bro, line 18: bad IPv6 subnet prefix length: 129 (:: / i)
|
||||||
|
1.2.3.4/32
|
||||||
|
::/128
|
||||||
|
init last
|
26
testing/btest/language/subnet-errors.bro
Normal file
26
testing/btest/language/subnet-errors.bro
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# @TEST-EXEC: bro -b %INPUT >out 2>&1
|
||||||
|
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out
|
||||||
|
|
||||||
|
event bro_init()
|
||||||
|
{
|
||||||
|
local i = 32;
|
||||||
|
print 1.2.3.4/i;
|
||||||
|
++i;
|
||||||
|
print 1.2.3.4/i;
|
||||||
|
print "init 1";
|
||||||
|
}
|
||||||
|
|
||||||
|
event bro_init()
|
||||||
|
{
|
||||||
|
local i = 128;
|
||||||
|
print [::]/i;
|
||||||
|
++i;
|
||||||
|
print [::]/i;
|
||||||
|
print "init 1";
|
||||||
|
}
|
||||||
|
|
||||||
|
event bro_init() &priority=-10
|
||||||
|
{
|
||||||
|
print "init last";
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue