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/
next prev 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).