From 9e24d747ffbc1040d93ac53bff0c1ef0914419c8 Mon Sep 17 00:00:00 2001 From: John Bond Date: Wed, 22 Nov 2023 11:35:22 +0100 Subject: [PATCH] [ruby/resolv] IPv6: update to_s method to be RFC5952 compliant (https://github.com/ruby/resolv/pull/25) * IPv6: update to_s method to be RFC5952 compliant I noticed that the resolv library does not honour RFC 5952 Section 4.2.2. in relation to textural representation of ipv6 addresses: The symbol "::" MUST NOT be used to shorten just one 16-bit 0 field. For example, the representation 2001:db8:0:1:1:1:1:1 is correct, but 2001:db8::1:1:1:1:1 is not correct. Fixes https://github.com/ruby/resolv/pull/24 https://github.com/ruby/resolv/commit/5efcd6ed70 Co-authored-by: Sorah Fukumori --- lib/resolv.rb | 6 +----- test/resolv/test_dns.rb | 3 ++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/resolv.rb b/lib/resolv.rb index 47c4ef6b3b..0db6cc5c59 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -2560,11 +2560,7 @@ class Resolv attr_reader :address def to_s # :nodoc: - address = sprintf("%x:%x:%x:%x:%x:%x:%x:%x", *@address.unpack("nnnnnnnn")) - unless address.sub!(/(^|:)0(:0)+(:|$)/, '::') - address.sub!(/(^|:)0(:|$)/, '::') - end - return address + sprintf("%x:%x:%x:%x:%x:%x:%x:%x", *@address.unpack("nnnnnnnn")).sub(/(^|:)0(:0)+(:|$)/, '::') end def inspect # :nodoc: diff --git a/test/resolv/test_dns.rb b/test/resolv/test_dns.rb index 9d243bbf50..d9db8408fd 100644 --- a/test/resolv/test_dns.rb +++ b/test/resolv/test_dns.rb @@ -374,7 +374,8 @@ class TestResolvDNS < Test::Unit::TestCase ["2001:db8::1", "2001:db8::0:1"], ["::", "0:0:0:0:0:0:0:0"], ["2001::", "2001::0"], - ["2001:db8::1:1:1:1:1", "2001:db8:0:1:1:1:1:1"], + ["2001:db8:0:1:1:1:1:1", "2001:db8:0:1:1:1:1:1"], # RFC 5952 Section 4.2.2. + ["2001:db8::1:1:1:1", "2001:db8:0:0:1:1:1:1"], ["1::1:0:0:0:1", "1:0:0:1:0:0:0:1"], ["1::1:0:0:1", "1:0:0:0:1:0:0:1"], ]