mirror of
https://github.com/zeek/zeek.git
synced 2025-10-04 23:58:20 +00:00
Improve error messages from to_addr and to_subnet BIFs
Related to GH-514
This commit is contained in:
parent
ac7daf8456
commit
ec4df80c67
9 changed files with 115 additions and 30 deletions
|
@ -242,30 +242,39 @@ IPPrefix::IPPrefix(const in6_addr& in6, uint8_t length)
|
|||
prefix.Mask(this->length);
|
||||
}
|
||||
|
||||
IPPrefix::IPPrefix(const IPAddr& addr, uint8_t length, bool len_is_v6_relative)
|
||||
: prefix(addr)
|
||||
bool IPAddr::CheckPrefixLength(uint8_t length, bool len_is_v6_relative) const
|
||||
{
|
||||
if ( prefix.GetFamily() == IPv4 && ! len_is_v6_relative )
|
||||
if ( GetFamily() == IPv4 && ! len_is_v6_relative )
|
||||
{
|
||||
if ( length > 32 )
|
||||
{
|
||||
reporter->Error("Bad IPAddr(v4) IPPrefix length : %d", length);
|
||||
this->length = 0;
|
||||
}
|
||||
else
|
||||
this->length = length + 96;
|
||||
return false;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if ( length > 128 )
|
||||
{
|
||||
reporter->Error("Bad IPAddr(v6) IPPrefix length : %d", length);
|
||||
this->length = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
IPPrefix::IPPrefix(const IPAddr& addr, uint8_t length, bool len_is_v6_relative)
|
||||
: prefix(addr)
|
||||
{
|
||||
if ( prefix.CheckPrefixLength(length, len_is_v6_relative) )
|
||||
{
|
||||
if ( prefix.GetFamily() == IPv4 && ! len_is_v6_relative )
|
||||
this->length = length + 96;
|
||||
else
|
||||
this->length = length;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto vstr = prefix.GetFamily() == IPv4 ? "v4" : "v6";
|
||||
reporter->Error("Bad IPAddr(%s) IPPrefix length : %d", vstr, length);
|
||||
this->length = 0;
|
||||
}
|
||||
|
||||
prefix.Mask(this->length);
|
||||
}
|
||||
|
@ -281,3 +290,28 @@ string IPPrefix::AsString() const
|
|||
|
||||
return prefix.AsString() +"/" + l;
|
||||
}
|
||||
|
||||
bool IPPrefix::ConvertString(const char* text, IPPrefix* result)
|
||||
{
|
||||
string s(text);
|
||||
size_t slash_loc = s.find('/');
|
||||
|
||||
if ( slash_loc == string::npos )
|
||||
return false;
|
||||
|
||||
auto ip_str = s.substr(0, slash_loc);
|
||||
auto len = atoi(s.substr(slash_loc + 1).data());
|
||||
|
||||
in6_addr tmp;
|
||||
|
||||
if ( ! IPAddr::ConvertString(ip_str.data(), &tmp) )
|
||||
return false;
|
||||
|
||||
auto ip = IPAddr(tmp);
|
||||
|
||||
if ( ! ip.CheckPrefixLength(len) )
|
||||
return false;
|
||||
|
||||
*result = IPPrefix(ip, len);
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue