From 53c3bef94cc797b6200ffd3c980813be850955ff Mon Sep 17 00:00:00 2001 From: Joe Cooper Date: Wed, 20 May 2026 16:36:28 -0500 Subject: [PATCH] Expand test coverage for check_ip6address --- t/miniserv.t | 10 ++++++++++ t/web-lib-funcs-ip.t | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/t/miniserv.t b/t/miniserv.t index cacdd0117..c53ca94d0 100644 --- a/t/miniserv.t +++ b/t/miniserv.t @@ -295,6 +295,16 @@ subtest 'check_ip6address' => sub { ok(!miniserv::check_ip6address('10.0.0.1'), 'bare IPv4 rejected (type-discriminator contract)'); ok(!miniserv::check_ip6address('1.2.3.4'), 'bare IPv4 rejected (type-discriminator contract)'); + # Degenerate netmask shapes — stripping "/N" from the input must not + # let an address that's otherwise just a stray colon (or empty) pass. + # perl's split() trims trailing empties hard, so e.g. split(":") is + # () not (""), and our @blocks==0 guard catches it. + ok(!miniserv::check_ip6address(':/64'), 'bare colon with netmask rejected'); + ok(!miniserv::check_ip6address('/64'), 'netmask without address rejected'); + ok(!miniserv::check_ip6address(':'), 'bare colon rejected'); + ok(!miniserv::check_ip6address('::/'), 'trailing slash with no digits rejected'); + ok(!miniserv::check_ip6address('//64'), 'leading slash with netmask rejected'); + ok(!miniserv::check_ip6address('gggg::1'), 'non-hex rejected'); ok(!miniserv::check_ip6address('1:2:3:4:5:6:7:8:9'), 'too many groups rejected'); ok(!miniserv::check_ip6address('::1::2'), 'multiple :: rejected'); diff --git a/t/web-lib-funcs-ip.t b/t/web-lib-funcs-ip.t index 8412c33e8..744b5ad0c 100644 --- a/t/web-lib-funcs-ip.t +++ b/t/web-lib-funcs-ip.t @@ -67,6 +67,16 @@ subtest 'check_ip6address' => sub { ok(!main::check_ip6address('10.0.0.1'), 'bare IPv4 rejected (type-discriminator contract)'); ok(!main::check_ip6address('1.2.3.4'), 'bare IPv4 rejected (type-discriminator contract)'); + # Degenerate netmask shapes — stripping "/N" from the input must not + # let an address that's otherwise just a stray colon (or empty) pass. + # perl's split() trims trailing empties hard, so e.g. split(":") is + # () not (""), and our @blocks==0 guard catches it. + ok(!main::check_ip6address(':/64'), 'bare colon with netmask rejected'); + ok(!main::check_ip6address('/64'), 'netmask without address rejected'); + ok(!main::check_ip6address(':'), 'bare colon rejected'); + ok(!main::check_ip6address('::/'), 'trailing slash with no digits rejected'); + ok(!main::check_ip6address('//64'), 'leading slash with netmask rejected'); + ok(!main::check_ip6address('gggg::1'), 'non-hex rejected'); ok(!main::check_ip6address('1:2:3:4:5:6:7:8:9'), 'too many groups rejected'); ok(!main::check_ip6address('::1::2'), 'multiple :: rejected');