Conf: Fix parsing full-length IPv6 addresses

Lexer expression for bytestring was too loose, accepting also
full-length IPv6 addresses. It should be restricted such that
colon is used between every byte or never.

Fix the regex and also add some test cases for it.

Thanks to Alexander Zubkov for the bugreport
This commit is contained in:
Ondrej Zajicek (work) 2022-01-05 16:38:49 +01:00
parent 75aceadaf7
commit 29dda184e5
2 changed files with 21 additions and 1 deletions

View file

@ -255,7 +255,7 @@ WHITE [ \t]
return IP4; return IP4;
} }
{XIGIT}{2}(:{XIGIT}{2}|{XIGIT}{2}){15,} { {XIGIT}{2}((:{XIGIT}{2}){15,}|({XIGIT}{2}){15,}) {
char *s = yytext; char *s = yytext;
size_t len = 0, i; size_t len = 0, i;
struct bytestring *bytes; struct bytestring *bytes;

View file

@ -335,6 +335,26 @@ ip p;
p = 1234:5678::; p = 1234:5678::;
bt_assert(!p.is_v4); bt_assert(!p.is_v4);
bt_assert(p.mask(24) = 1234:5600::); bt_assert(p.mask(24) = 1234:5600::);
p = 1:2:3:4:5:6:7:8;
bt_assert(!p.is_v4);
bt_assert(format(p) = "1:2:3:4:5:6:7:8");
bt_assert(p.mask(64) = 1:2:3:4::);
p = 10:20:30:40:50:60:70:80;
bt_assert(!p.is_v4);
bt_assert(format(p) = "10:20:30:40:50:60:70:80");
bt_assert(p.mask(64) = 10:20:30:40::);
p = 1090:20a0:30b0:40c0:50d0:60e0:70f0:8000;
bt_assert(!p.is_v4);
bt_assert(format(p) = "1090:20a0:30b0:40c0:50d0:60e0:70f0:8000");
bt_assert(p.mask(64) = 1090:20a0:30b0:40c0::);
p = ::fffe:6:c0c:936d:88c7:35d3;
bt_assert(!p.is_v4);
bt_assert(format(p) = "::fffe:6:c0c:936d:88c7:35d3");
bt_assert(p.mask(64) = 0:0:fffe:6::);
} }
bt_test_suite(t_ip, "Testing ip address"); bt_test_suite(t_ip, "Testing ip address");