ruby-dev (Japanese) list archive (unofficial mirror)
 help / color / mirror / Atom feed
From: k1lowxb@gmail•com
To: ruby-dev@ruby-lang.org
Subject: [ruby-dev:50316] [Ruby trunk Bug#14119] IPAdrr#include? does not seem to support the subnet mask
Date: Mon, 20 Nov 2017 05:29:30 +0000 (UTC)	[thread overview]
Message-ID: <redmine.issue-14119.20171120052929.56344c9a6edfb346@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-14119.20171120052929@ruby-lang.org

Issue #14119 has been reported by k1LoW (Ken'ichiro Oyama).

----------------------------------------
Bug #14119: IPAdrr#include? does not seem to support the subnet mask
https://bugs.ruby-lang.org/issues/14119

* Author: k1LoW (Ken'ichiro Oyama)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin15]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
IPAdrr#include? において、引数のIPAddrオブジェクトのネットマスクが考慮された判定になっていないようです。

## 再現方法と得られた結果

~~~
irb(main):001:0> require 'ipaddr'
=> true
irb(main):002:0> IPAddr.new('10.5.0.0/24').include?('10.5.0.0/16')
=> true
irb(main):003:0> IPAddr.new('10.5.0.0/16').include?('10.5.0.0/24')
=> true
irb(main):004:0> IPAddr.new('10.5.0.0/24').include?(IPAddr.new('10.5.0.0/16'))
=> true
irb(main):005:0> IPAddr.new('10.5.0.0/16').include?(IPAddr.new('10.5.0.0/24'))
=> true
~~~

## 期待した結果と、それを期待した理由

~~~
irb(main):001:0> require 'ipaddr'
=> true
irb(main):002:0> IPAddr.new('10.5.0.0/24').include?('10.5.0.0/16')
=> true
irb(main):003:0> IPAddr.new('10.5.0.0/16').include?('10.5.0.0/24')
=> false
irb(main):004:0> IPAddr.new('10.5.0.0/24').include?(IPAddr.new('10.5.0.0/16'))
=> true
irb(main):005:0> IPAddr.new('10.5.0.0/16').include?(IPAddr.new('10.5.0.0/24'))
=> false
~~~

### 期待した理由

- IPAddrオブジェクトは `#include?` において、レシーバはIPアドレス範囲(集合)として動いている
- [るりま](https://docs.ruby-lang.org/ja/latest/class/IPAddr.html#I_--3D--3D--3D) によると、引数について「与えられた IPAddr オブジェクトが自身の範囲に入っているかを判定します」とある

上記の情報から、レシーバと引数とは集合同士の包含関係をチェックするのが直感的ではないか?と考えたからです。
(片方のIPAddrオブジェクトだけ集合で、片方のIPAddrオブジェクトだけ単一IPアドレスという点が直感的ではない)

### 期待される結果であった場合のユースケース

- iptablesなどで設定されているCIDR表記のIPアドレス範囲に対して、確認したいIPアドレス範囲が含まれているかどうかの確認

---

## 過去の議論のサーベイ

### 1905

#1905 のチケットの中において、`#==` の挙動についての議論の中にIPAddrについての説明ありました(ML側が抜け落ちているので [リンク ruby-dev:39381](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39381))

整形して引用:

```
> > IPAddr.new("192.168.2.0/24") == IPAddr.new("192.168.2.0/32")
> >
> > が true から false に変わるという仕様変更なのですが、どうでしょうか?
>
> というのがまずいでしょうか。

 これは受け入れられません。IPAddrはネットマスクも保持するため
ネットワークもできますが、第一義はIPアドレスなので、ネット
マスクの違いで等しくなくなるのはまずいです。
```

上記から、IPAddrは、まず単一のIPアドレスとして動くことが求められていることは理解しました。

その後、ネットマスクを考慮した拡張についての議論が [ruby-dev:39391](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39391) であるようなのですが、
こちらは文字化けがあり、まだしっかりと確認・理解できていません。すみません。

### 1275

#1275 のチケットにおいてネットマスクでIPアドレスの情報が消される問題についての議論がありました。

### 過去の議論をふまえて

- 「`IPAdrr#include?` においてはIPアドレス範囲同士の包含関係を見るようにする」のみの修正であれば、IPAddrの第一義に反していないと言えるのでは?と考えています(`IPAdrr#include?`のタイミングではレシーバはネットマスクを考慮するため)。
- #1275 のパッチが入った場合は、本チケットについての修正内容も変更されると思います。
- 上記より踏み込んだ修正は、[ruby-dev:39391](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39391) にある(であろう)流れの拡張になろうだろうと考えています。



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

       reply	other threads:[~2017-11-20  5:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <redmine.issue-14119.20171120052929@ruby-lang.org>
2017-11-20  5:29 ` k1lowxb [this message]
2017-11-20  5:40 ` [ruby-dev:50317] [Ruby trunk Bug#14119] IPAddr#include? does not seem to support the subnet mask k1lowxb
2017-11-20  5:42 ` [ruby-dev:50318] [Ruby trunk Bug#14119][Assigned] " hsbt
2019-10-31 17:12 ` [ruby-dev:50855] [Ruby master Bug#14119] " merch-redmine
2019-12-03 22:38 ` [ruby-dev:50875] " merch-redmine

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.issue-14119.20171120052929.56344c9a6edfb346@ruby-lang.org \
    --to=ruby-dev@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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).