From 4af872b79f492024277fccdcc536887828e53cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Sun, 27 Nov 2022 00:48:01 +0100 Subject: [PATCH 1/6] IPAddress#loopback? should consider ::ffff:127.0.0.1/104 loopback too --- spec/std/socket/address_spec.cr | 3 +++ src/socket/address.cr | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/spec/std/socket/address_spec.cr b/spec/std/socket/address_spec.cr index 95cb170a3477..77dc12da93a8 100644 --- a/spec/std/socket/address_spec.cr +++ b/spec/std/socket/address_spec.cr @@ -127,6 +127,9 @@ describe Socket::IPAddress do Socket::IPAddress.new("::2", 0).loopback?.should be_false Socket::IPAddress.new(Socket::IPAddress::LOOPBACK, 0).loopback?.should be_true Socket::IPAddress.new(Socket::IPAddress::LOOPBACK6, 0).loopback?.should be_true + Socket::IPAddress.new("::ffff:127.0.0.1", 0).loopback?.should be_true + Socket::IPAddress.new("::ffff:127.0.1.1", 0).loopback?.should be_true + Socket::IPAddress.new("::ffff:1.0.0.1", 0).loopback?.should be_false end it "#unspecified?" do diff --git a/src/socket/address.cr b/src/socket/address.cr index 5ce5f40bf4d4..290ed32fb9b6 100644 --- a/src/socket/address.cr +++ b/src/socket/address.cr @@ -227,7 +227,9 @@ class Socket in LibC::InAddr addr.s_addr & 0x000000ff_u32 == 0x0000007f_u32 in LibC::In6Addr - ipv6_addr8(addr) == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 1_u8] + addr8 = ipv6_addr8(addr) + addr8 == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 1_u8] || + addr8.to_slice[0, 13] == Bytes[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 255_u8, 255_u8, 127_u8] end end From 87840f8b969a76b237028ff24152e169a2728ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Tue, 29 Nov 2022 16:53:38 +0100 Subject: [PATCH 2/6] Update src/socket/address.cr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Johannes Müller --- src/socket/address.cr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/socket/address.cr b/src/socket/address.cr index 290ed32fb9b6..ec6d11aabea0 100644 --- a/src/socket/address.cr +++ b/src/socket/address.cr @@ -228,8 +228,8 @@ class Socket addr.s_addr & 0x000000ff_u32 == 0x0000007f_u32 in LibC::In6Addr addr8 = ipv6_addr8(addr) - addr8 == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 1_u8] || - addr8.to_slice[0, 13] == Bytes[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 255_u8, 255_u8, 127_u8] + addr8 == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 1_u8] || # "::1" + addr8.to_slice[0, 13] == Bytes[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 255_u8, 255_u8, 127_u8] # "::ffff:127.0.0.1/104" end end From a5331b76159053d4a4ca504596402129f55751d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Wed, 14 Dec 2022 00:21:56 +0100 Subject: [PATCH 3/6] Use a StaticArray instead of Bytes slice --- src/socket/address.cr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/socket/address.cr b/src/socket/address.cr index ec6d11aabea0..0670bc25a074 100644 --- a/src/socket/address.cr +++ b/src/socket/address.cr @@ -228,8 +228,8 @@ class Socket addr.s_addr & 0x000000ff_u32 == 0x0000007f_u32 in LibC::In6Addr addr8 = ipv6_addr8(addr) - addr8 == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 1_u8] || # "::1" - addr8.to_slice[0, 13] == Bytes[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 255_u8, 255_u8, 127_u8] # "::ffff:127.0.0.1/104" + addr8 == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 1_u8] || # "::1" + addr8.to_slice[0, 13] == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 255_u8, 255_u8, 127_u8].to_slice # "::ffff:127.0.0.1/104" end end From 3663384967235c99e6f02016fc92fcf0ae24f045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Wed, 14 Dec 2022 00:24:04 +0100 Subject: [PATCH 4/6] Convert ipv6 to an uint128 and compare --- src/socket/address.cr | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/socket/address.cr b/src/socket/address.cr index 0670bc25a074..9c1993d1190e 100644 --- a/src/socket/address.cr +++ b/src/socket/address.cr @@ -228,8 +228,9 @@ class Socket addr.s_addr & 0x000000ff_u32 == 0x0000007f_u32 in LibC::In6Addr addr8 = ipv6_addr8(addr) - addr8 == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 1_u8] || # "::1" - addr8.to_slice[0, 13] == StaticArray[0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 255_u8, 255_u8, 127_u8].to_slice # "::ffff:127.0.0.1/104" + num = addr8.unsafe_as(UInt128) + num == (1_u128 << 120) || # "::1" + num & 0xffffffffffffffffffffffffff_u128 == 0x7fffff00000000000000000000_u128 # "::ffff:127.0.0.1/104" end end From f9a212bcf51d4f9f1b94d44deee67f973c08488e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Wed, 21 Dec 2022 09:48:20 +0100 Subject: [PATCH 5/6] Avoid u128 literals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As they aren't supported in older crystal versions Co-authored-by: Johannes Müller --- src/socket/address.cr | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/socket/address.cr b/src/socket/address.cr index 9c1993d1190e..e2500c2ba2d7 100644 --- a/src/socket/address.cr +++ b/src/socket/address.cr @@ -229,8 +229,9 @@ class Socket in LibC::In6Addr addr8 = ipv6_addr8(addr) num = addr8.unsafe_as(UInt128) - num == (1_u128 << 120) || # "::1" - num & 0xffffffffffffffffffffffffff_u128 == 0x7fffff00000000000000000000_u128 # "::ffff:127.0.0.1/104" + # TODO: Use UInt128 literals + num == (1_u128 << 120) || # "::1" + num & UInt128::MAX >> 24 == 0x7fffff_u128 << 80 # "::ffff:127.0.0.1/104" end end From e7199640520ba791ad9e5bc8806f180e04ae782a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20M=C3=BCller?= Date: Thu, 5 Jan 2023 20:16:46 +0100 Subject: [PATCH 6/6] `crystal tool format` --- src/socket/address.cr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/socket/address.cr b/src/socket/address.cr index dcb97dc9cf5c..f29eb8f067b7 100644 --- a/src/socket/address.cr +++ b/src/socket/address.cr @@ -229,8 +229,8 @@ class Socket in LibC::In6Addr addr8 = ipv6_addr8(addr) num = addr8.unsafe_as(UInt128) - # TODO: Use UInt128 literals - num == (1_u128 << 120) || # "::1" + # TODO: Use UInt128 literals + num == (1_u128 << 120) || # "::1" num & UInt128::MAX >> 24 == 0x7fffff_u128 << 80 # "::ffff:127.0.0.1/104" end end