mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/ipaddr] 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 https://github.com/ruby/ipaddr/commit/f45630da31
This commit is contained in:
parent
b9f7286fe9
commit
9a321dd9b2
2 changed files with 8 additions and 25 deletions
|
@ -167,34 +167,15 @@ class IPAddr
|
|||
# net1 = IPAddr.new("192.168.2.0/24")
|
||||
# net2 = IPAddr.new("192.168.2.100")
|
||||
# net3 = IPAddr.new("192.168.3.0")
|
||||
# net4 = IPAddr.new("192.168.2.0/16")
|
||||
# p net1.include?(net2) #=> true
|
||||
# p net1.include?(net3) #=> false
|
||||
# p net1.include?(net4) #=> false
|
||||
# p net4.include?(net1) #=> true
|
||||
def include?(other)
|
||||
other = coerce_other(other)
|
||||
if ipv4_mapped?
|
||||
if (@mask_addr >> 32) != 0xffffffffffffffffffffffff
|
||||
return false
|
||||
end
|
||||
mask_addr = (@mask_addr & IN4MASK)
|
||||
addr = (@addr & IN4MASK)
|
||||
family = Socket::AF_INET
|
||||
else
|
||||
mask_addr = @mask_addr
|
||||
addr = @addr
|
||||
family = @family
|
||||
end
|
||||
if other.ipv4_mapped?
|
||||
other_addr = (other.to_i & IN4MASK)
|
||||
other_family = Socket::AF_INET
|
||||
else
|
||||
other_addr = other.to_i
|
||||
other_family = other.family
|
||||
end
|
||||
|
||||
if family != other_family
|
||||
return false
|
||||
end
|
||||
return ((addr & mask_addr) == (other_addr & mask_addr))
|
||||
range = to_range
|
||||
other = coerce_other(other).to_range
|
||||
range.begin <= other.begin && range.end >= other.end
|
||||
end
|
||||
alias === include?
|
||||
|
||||
|
|
|
@ -350,6 +350,8 @@ class TC_Operator < Test::Unit::TestCase
|
|||
assert_equal(true, net1.include?(IPAddr.new("192.168.2.0")))
|
||||
assert_equal(true, net1.include?(IPAddr.new("192.168.2.255")))
|
||||
assert_equal(false, net1.include?(IPAddr.new("192.168.3.0")))
|
||||
assert_equal(true, net1.include?(IPAddr.new("192.168.2.0/28")))
|
||||
assert_equal(false, net1.include?(IPAddr.new("192.168.2.0/16")))
|
||||
# test with integer parameter
|
||||
int = (192 << 24) + (168 << 16) + (2 << 8) + 13
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue