diff --git a/src/Expr.cc b/src/Expr.cc index cb932ff7ee..be186524ad 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -1795,7 +1795,20 @@ Val* DivideExpr::AddrFold(Val* v1, Val* v2) const else mask = static_cast(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); diff --git a/src/IPAddr.cc b/src/IPAddr.cc index 7ccc3dce07..7917e82c29 100644 --- a/src/IPAddr.cc +++ b/src/IPAddr.cc @@ -216,7 +216,10 @@ IPPrefix::IPPrefix(const in4_addr& in4, uint8_t length) : prefix(in4), length(96 + length) { 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); } @@ -225,7 +228,10 @@ IPPrefix::IPPrefix(const in6_addr& in6, uint8_t length) : prefix(in6), length(length) { 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); } @@ -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 ( length > 32 ) - reporter->InternalError("Bad IPAddr(v4) IPPrefix length : %d", - length); - - this->length = length + 96; + { + reporter->Error("Bad IPAddr(v4) IPPrefix length : %d", length); + this->length = 0; + } + else + this->length = length + 96; } else { if ( length > 128 ) - reporter->InternalError("Bad IPAddr(v6) IPPrefix length : %d", - length); - - this->length = length; + { + reporter->Error("Bad IPAddr(v6) IPPrefix length : %d", length); + this->length = 0; + } + else + this->length = length; } prefix.Mask(this->length); diff --git a/testing/btest/Baseline/language.subnet-errors/out b/testing/btest/Baseline/language.subnet-errors/out new file mode 100644 index 0000000000..5d8e3d76da --- /dev/null +++ b/testing/btest/Baseline/language.subnet-errors/out @@ -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 diff --git a/testing/btest/language/subnet-errors.bro b/testing/btest/language/subnet-errors.bro new file mode 100644 index 0000000000..fa98dcec48 --- /dev/null +++ b/testing/btest/language/subnet-errors.bro @@ -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"; + } +