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
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
		Add a link
		
	
		Reference in a new issue