ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: runner@berkeley.edu
To: ruby-core@ruby-lang.org
Subject: [ruby-core:78278] [Ruby trunk Bug#11531] IPAddr#== implements wrong logic
Date: Wed, 23 Nov 2016 17:37:39 +0000	[thread overview]
Message-ID: <redmine.journal-61645.20161123173738.e616c55da9239264@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-11531.20150916031715@ruby-lang.org

Issue #11531 has been updated by Steven Hansen.


Akinori MUSHA wrote:
> I think this is intentional.  IPAddr represents an IP address, not an IP network, so it does not consider a difference in netmasks as significant.

I disagree that IPAddr represents an IP address (I think a more accurately represents a CIDR block).  To add to Ben's point:

`
IPAddr.new('128.128.128.128').to_range.to_a # => [#<IPAddr: IPv4:128.128.128.128/255.255.255.255>]
`

`
IPAddr.new('128.128.128.128/30').to_range.to_a # => [#<IPAddr: IPv4:128.128.128.128/255.255.255.252>, #<IPAddr: IPv4:128.128.128.129/255.255.255.252>, #<IPAddr: IPv4:128.128.128.130/255.255.25│
5.252>, #<IPAddr: IPv4:128.128.128.131/255.255.255.252>]
`

The fact that IPAddr accepts a CIDR block mean it represents 1 or more IPs.  So an IPAddr with 1 IP should not be equal to an IPAddr with 4 IPs

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

* 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/

  parent reply	other threads:[~2016-11-23 17:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <redmine.issue-11531.20150916031715@ruby-lang.org>
2015-09-16  3:17 ` [ruby-core:70827] [Ruby trunk - Bug #11531] [Open] IPAddr#== implements wrong logic panasmeister
2016-11-06 16:22 ` [ruby-core:78018] [Ruby trunk Bug#11531] " knu
2016-11-15 22:28 ` [ruby-core:78160] " bjmllr
2016-11-23 17:37 ` runner [this message]
2016-11-23 17:40 ` [ruby-core:78279] " runner
2019-10-31 16:51 ` [ruby-core:95611] [Ruby master " merch-redmine
2019-12-29 12:50 ` [ruby-core:96570] " hsbt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.ruby-lang.org/en/community/mailing-lists/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=redmine.journal-61645.20161123173738.e616c55da9239264@ruby-lang.org \
    --to=ruby-core@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).