From 8696d8fdecf1626939f0f487ff6813c606481f4e Mon Sep 17 00:00:00 2001 From: AC Date: Sat, 10 Oct 2026 15:43:09 +0800 Subject: [PATCH] Respect explicit address families for decorated IPv6 literals Signed-off-by: AC --- lib/ipaddr.rb | 3 ++- test/test_ipaddr.rb | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/ipaddr.rb b/lib/ipaddr.rb index 10027f3..51c6898 100644 --- a/lib/ipaddr.rb +++ b/lib/ipaddr.rb @@ -712,6 +712,7 @@ def initialize(addr = '::', family = Socket::AF_UNSPEC) raise AddressFamilyError, "unsupported address family: #{family}" end end + requested_family = family prefix, prefixlen = addr.split('/', 2) if prefix =~ /\A\[(.*)\]\z/i prefix = $1 @@ -737,7 +738,7 @@ def initialize(addr = '::', family = Socket::AF_UNSPEC) @family = Socket::AF_INET6 end @zone_id = zone_id - if family != Socket::AF_UNSPEC && @family != family + if requested_family != Socket::AF_UNSPEC && @family != requested_family raise AddressFamilyError, "address family mismatch" end if prefixlen diff --git a/test/test_ipaddr.rb b/test/test_ipaddr.rb index 6a4b0cb..3b73664 100644 --- a/test/test_ipaddr.rb +++ b/test/test_ipaddr.rb @@ -108,10 +108,14 @@ def test_s_new assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.011") } assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%") } assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%]") } + assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]") } assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]/120") } assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[2001:200:300::]\nINVALID") } assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.1/32\nINVALID") } assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.1/32/20") } + assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.1.2", Socket::AF_INET6) } + assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]", Socket::AF_INET6) } + assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]", Socket::AF_INET) } assert_raise(IPAddr::InvalidPrefixError) { IPAddr.new("192.168.0.1/032") } assert_raise(IPAddr::InvalidPrefixError) { IPAddr.new("::1/0128") } assert_raise(IPAddr::InvalidPrefixError) { IPAddr.new("::1/255.255.255.0") } @@ -120,6 +124,9 @@ def test_s_new assert_raise(IPAddr::InvalidPrefixError) { IPAddr.new("192.168.0.1/255.255.255.1") } assert_raise(IPAddr::AddressFamilyError) { IPAddr.new(1) } assert_raise(IPAddr::AddressFamilyError) { IPAddr.new("::ffff:192.168.1.2/120", Socket::AF_INET) } + assert_raise(IPAddr::AddressFamilyError) { IPAddr.new("[::]", Socket::AF_INET) } + assert_raise(IPAddr::AddressFamilyError) { IPAddr.new("::%eth0", Socket::AF_INET) } + assert_raise(IPAddr::AddressFamilyError) { IPAddr.new("[::%eth0]", Socket::AF_INET) } end def test_s_new_ntoh