[ruby-core:78160] [Ruby trunk Bug#11531] IPAddr#== implements wrong logic

From: bjmllr@...
Date: 2016-11-15 22:28:34 UTC
List: ruby-core #78160
Issue #11531 has been updated by Ben Miller.


> it does not consider a difference in netmasks as significant

IPAddr.new isn't consistent with this principle:

```ruby
IPAddr.new("1.2.3.4/24") == IPAddr.new("1.2.3.4/32") # => false
```

1.2.3.4/24 is valid notation for a host address, yet IPAddr.new will drop the low-order bits to make it a valid network address:

```ruby
IPAddr.new("1.2.3.4/24") == IPAddr.new("1.2.3.0/24") # => true
```

I'm not sure why we would want to have a netmask at all if IPAddr is only for host addresses.

----------------------------------------
Bug #11531: IPAddr#== implements wrong logic
https://bugs.ruby-lang.org/issues/11531#change-61517

* Author: Aleksander Panasyuk
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: 2.1.5p273
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
# Description
IPAddr#== should implement the logic of comparison of two IPAddr instances. This generally means that it compares two IP addresses.
Lets look at the code of this method:

https://github.com/ruby/ruby/blob/c8b3f1b470e343e7408ab5883f046b1056d94ccc/lib/ipaddr.rb#L151

`return @family == other.family && @addr == other.to_i`

It returns the result of comparison of the families and the addresses, but it should also compare the netmask which describes the network where this address is located.
The code below shows the test case for this comparison:
`
ip1 = IPAddr.new '195.51.100.0/24'
ip2 = IPAddr.new '195.51.100.0/26'
ip1 == ip2 #=> true
`
This code shows that two identical IP addresses from different networks are equal. But the result should be `false` because these addresses are not identical.

# Possible solution
Depending on Feature #11210 i would propose following implementation of this method:
`
def ==(other)
  other = coerce_other(other)
  return @family == other.family && @addr == other.to_i && @mask_addr == other.netmask
end
`



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next