Skip to content

Commit f2303fc

Browse files
committed
Make IPAddr#include? consider range of argument
It would be nice to use Range#cover? here, but it doesn't work correctly before Ruby 2.6. Switch to manual checks of the beginning of end of the ranges. Fixes Ruby Bug 14119
1 parent 5dec357 commit f2303fc

File tree

2 files changed

+8
-25
lines changed

2 files changed

+8
-25
lines changed

lib/ipaddr.rb

+6-25
Original file line numberDiff line numberDiff line change
@@ -168,34 +168,15 @@ def mask(prefixlen)
168168
# net1 = IPAddr.new("192.168.2.0/24")
169169
# net2 = IPAddr.new("192.168.2.100")
170170
# net3 = IPAddr.new("192.168.3.0")
171+
# net4 = IPAddr.new("192.168.2.0/16")
171172
# p net1.include?(net2) #=> true
172173
# p net1.include?(net3) #=> false
174+
# p net1.include?(net4) #=> false
175+
# p net4.include?(net1) #=> true
173176
def include?(other)
174-
other = coerce_other(other)
175-
if ipv4_mapped?
176-
if (@mask_addr >> 32) != 0xffffffffffffffffffffffff
177-
return false
178-
end
179-
mask_addr = (@mask_addr & IN4MASK)
180-
addr = (@addr & IN4MASK)
181-
family = Socket::AF_INET
182-
else
183-
mask_addr = @mask_addr
184-
addr = @addr
185-
family = @family
186-
end
187-
if other.ipv4_mapped?
188-
other_addr = (other.to_i & IN4MASK)
189-
other_family = Socket::AF_INET
190-
else
191-
other_addr = other.to_i
192-
other_family = other.family
193-
end
194-
195-
if family != other_family
196-
return false
197-
end
198-
return ((addr & mask_addr) == (other_addr & mask_addr))
177+
range = to_range
178+
other = coerce_other(other).to_range
179+
range.begin <= other.begin && range.end >= other.end
199180
end
200181
alias === include?
201182

test/test_ipaddr.rb

+2
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,8 @@ def test_include?
292292
assert_equal(true, net1.include?(IPAddr.new("192.168.2.0")))
293293
assert_equal(true, net1.include?(IPAddr.new("192.168.2.255")))
294294
assert_equal(false, net1.include?(IPAddr.new("192.168.3.0")))
295+
assert_equal(true, net1.include?(IPAddr.new("192.168.2.0/28")))
296+
assert_equal(false, net1.include?(IPAddr.new("192.168.2.0/16")))
295297
# test with integer parameter
296298
int = (192 << 24) + (168 << 16) + (2 << 8) + 13
297299

0 commit comments

Comments
 (0)