88 Commits
Author SHA1 Message Date
Wleeaf c2b6f7f0a7 [ruby/ipaddr] Allow -, . and ~ in IPv6 zone IDs
IPAddr.new and IPAddr#zone_id= only accepted \w characters after %, so zone IDs for interfaces such as eth0.100 (VLAN) or br-lan raised InvalidAddressError. RFC 6874 defines ZoneID as unreserved characters (ALPHA, DIGIT, -, ., _, ~), which is also what Resolv::IPv6 accepts (%[-0-9A-Za-z._~]+). Use the same character class in both places.

https://github.com/ruby/ipaddr/commit/8aaee2fa0c
2026-10-25 07:33:12 +00:00
Taketo Takashima 3d3d1b0329 [ruby/ipaddr] Add IPAddr#to_bits
Returns the binary representation of the address value as a string of
"0" and "1" characters, right adjusted to the address size (32
characters for IPv4, 128 for IPv6).

https://github.com/ruby/ipaddr/commit/63beaa749e
2026-10-20 12:32:51 +00:00
Taketo Takashima ca96afe2b7 [ruby/ipaddr] Warn on bracketed IPv6 address with a prefix length
IPAddr.new("[2001:db8::]/32") is currently accepted and treated the
same as IPAddr.new("2001:db8::/32"). However, square brackets are a
delimiter for embedding an address in a larger syntax such as
host:port (RFC 5952 section 6), and no notation is defined for a
prefix length after the closing bracket.

Print a warning for this form, saying that it will raise
IPAddr::InvalidAddressError in a future version. The result is
unchanged for now. "[2001:db8::]" and "2001:db8::/32" are not
affected.

https://github.com/ruby/ipaddr/commit/a540d51a31
2026-10-17 02:35:55 +00:00
Tjerk Meesters 3617d3ea5a [ruby/ipaddr] Add IPAddr#to_hex
Returns the hexadecimal representation of the address value, right
adjusted to the address size (8 characters for IPv4, 32 for IPv6).

https://github.com/ruby/ipaddr/commit/e19c9b153b
2026-10-17 02:35:03 +00:00
Taketo Takashima e242384ced [ruby/ipaddr] Bump the version to 1.3.0
https://github.com/ruby/ipaddr/commit/a3f7dbe1b7
2026-10-16 02:17:02 +00:00
AC b660facc76 [ruby/ipaddr] Respect explicit address families for decorated IPv6 literals
Signed-off-by: AC <ac@fabtek.cn>

https://github.com/ruby/ipaddr/commit/8696d8fdec
2026-10-16 00:29:26 +00:00
Andrii Furmanets 3143ac9c21 [ruby/ipaddr] Append the zone ID after compressing the address in IPAddr#to_s
IPAddr#to_s ran its zero-compression and IPv4-tail regexps on the
output of #to_string, which already ends with the zone ID. That had
two effects for IPv6 addresses with a zone ID:

* Anchored patterns no longer matched, so "::%eth0" was printed as
  "::0%eth0", and "::ffff:192.168.1.2%eth0" as
  "::ffff:c0a8:102%eth0" instead of using the dotted IPv4 tail.
* The leading-zero stripping also applied to the zone ID, so
  "fe80::1%0ab" was printed as "fe80::1%ab", naming a different zone.

Build the compressed form from the bare address and append the zone ID
at the end.

https://github.com/ruby/ipaddr/commit/6c406450ae
2026-10-10 06:29:44 +00:00
Taketo Takashima b8c309176e [ruby/ipaddr] Fix false positives in private?/link_local?/multicast?/link_local_multicast? for supernets of the target address blocks
private?, link_local?, multicast?, link_local_multicast? only compare
the masked address (`@addr`) against each address block's network
address, and never check whether the receiver's prefix is at least
as long as the address block's prefix. As a result, a network whose
prefix is shorter than the address block (e.g. 192.168.0.0/15, a
supernet of the private 192.168.0.0/16 address block) is wrongly
reported as true.

  IPAddr.new("192.168.0.0/15").private?
  # => true # expected false

Add a prefix length check to the existing address comparison,
ensuring that the receiver's network is fully contained within the
target address block.

https://github.com/ruby/ipaddr/commit/dfa97a86e1
2026-10-08 08:12:35 +00:00
carlosdanielpohlod e25bcba0ed [ruby/ipaddr] Fix link_local_multicast? mask for IPv4-mapped addresses
The IPv4 branch matches 224.0.0.0/24, the Local Network Control Block,
but the IPv4-mapped branch masked with 0xffff0000, which is a /16, even
though its comment says /24. So an address was classified differently
depending on whether it arrived as 224.0.1.1 or ::ffff:224.0.1.1, which
is the form a dual-stack AF_INET6 socket hands you.

The other predicates in the family already use the same mask on both
branches.

https://github.com/ruby/ipaddr/commit/eebe5b237d
2026-09-09 23:24:43 +00:00
HoneyryderChuck bb472c530a [ruby/ipaddr] extra multicast/unicast predicates
This adds the following predicate methods to IPAddr objects:

* `#multicast?`: whether the ip address is multicast
* `#link_local_multicast?`: whether the ip address is a link-local
  multicast

it also alias `IPAddr#link_local?` as `IPAddr#link_local_unicast?`,
which is more accurate (whether the original should be deprecated is
probably a separate discussion).

https://github.com/ruby/ipaddr/commit/332ae1ffbf
2026-07-15 13:12:23 +00:00
Taketo Takashima 6342f3ac55 [ruby/ipaddr] Bump the version to 1.2.9
https://github.com/ruby/ipaddr/commit/f17f68bcab
2026-04-24 23:14:00 +00:00
Taketo Takashima a6f2450f61 [ruby/ipaddr] Fix IPAddr#== returning true when compared with nil for 0.0.0.0 and ::
https://github.com/ruby/ipaddr/commit/a716379948
2026-04-24 22:54:55 +00:00
Adrien Rey-Jarthon 16ad249a2e [ruby/ipaddr] Fix private?, link_local? and loopback? methods to avoid mistaking public IPv6 as IPv4-mapped
https://github.com/ruby/ipaddr/commit/c1383a3356
2026-04-23 23:58:10 +00:00
Taketo Takashima 1f526b3489 [ruby/ipaddr] Follow-up fix for InvalidAddressError messages
https://github.com/ruby/ipaddr/commit/b92ef74b91
2025-12-26 11:00:51 +09:00
Hiroshi SHIBATA 5f444cba47 [ruby/ipaddr] v1.2.8
https://github.com/ruby/ipaddr/commit/93ef50bc04
2025-12-10 05:22:25 +00:00
Nobuyoshi Nakada 79342334e0 [ruby/ipaddr] [DOC] Stop documentation for internals
https://github.com/ruby/ipaddr/commit/cb9f561883
2025-11-09 12:27:12 +00:00
ishikawa999 ff6bd7fb4e [ruby/ipaddr] Fix InvalidAddressError message
https://github.com/ruby/ipaddr/commit/c96dbadee3
2025-10-17 05:11:36 +00:00
Taketo TakashimaandTietew feb9114a53 [ruby/ipaddr] Fix #ipv4_compat returning invalid prefix
https://github.com/ruby/ipaddr/commit/7c85bb8dfd

Co-authored-by: Tietew <tietew@gmail.com>
2025-09-26 23:25:25 +00:00
Taketo Takashima 687bd83724 [ruby/ipaddr] Added IPAddr#+/-
https://github.com/ruby/ipaddr/commit/78b4f53bf5
2025-04-26 11:56:42 +00:00
Akinori MUSHA b101ca598e [ruby/ipaddr] Bump the version to 1.2.7
https://github.com/ruby/ipaddr/commit/b44d2a1173
2024-10-19 12:59:03 +00:00
Akinori MUSHA bfc586b2be [ruby/ipaddr] Use string interpolation instead of format()
https://github.com/ruby/ipaddr/commit/1f41cd7320
2024-10-19 12:56:27 +00:00
Akinori MUSHA 689f14e255 [ruby/ipaddr] Use string interpolation instead of format()
https://github.com/ruby/ipaddr/commit/73f59e111f
2024-10-18 16:03:49 +00:00
Taketo Takashima eb8cf1d60e [ruby/ipaddr] Added to_json/as_json method
Updated to use cidr method when return address with prefix in #as_json

https://github.com/ruby/ipaddr/commit/cf8181d53e
2024-10-18 15:00:37 +00:00
Ben Fritsch 6ac8f6a10e [ruby/ipaddr] Add IPAddr.cidr to return ip address in cidr notation
https://github.com/ruby/ipaddr/commit/f5b006741f
2024-04-18 10:27:19 +09:00
Taketo Takashima f9f25d0ed0 [ruby/ipaddr] Added IPAddr#wildcard_mask
https://github.com/ruby/ipaddr/commit/2093cebc1d
2024-04-10 10:30:53 +00:00
Akira Matsuda 73dd3ce03e [ruby/ipaddr] Prefer String#start_with? over Regexp.match
https://github.com/ruby/ipaddr/commit/054fe12ec4
2024-02-23 17:56:08 +00:00
Akira Matsuda 6ad52e336d [ruby/ipaddr] String#split seems to be faster than capturing digits with Regexp
https://github.com/ruby/ipaddr/commit/e0feb0708b
2024-02-23 17:55:33 +00:00
Earlopain 86fa418dea [ruby/ipaddr] Consider IPv4-mapped IPv6 addresses link local/loopback if IPV4 address is private
Same as #57

https://github.com/ruby/ipaddr/commit/d56acecb80
2023-12-25 21:12:49 +09:00
Luke Randall da77c79d80 [ruby/ipaddr] Fix regressions in exception messages
Changes introduced by 09edfd4 have broken some exception
messages, and added the address as an unnecessary
suffix in others.

https://github.com/ruby/ipaddr/commit/74a043109c
2023-12-25 21:12:49 +09:00
Kasumi Hanazuki eb53131367 [ruby/ipaddr] ntop: Measure address size in bytes
`IPAddr.ntop` takes the binary representation of an IP address, whose
length should be 4 or 16 *bytes* (not characters/codepoints).

The current implementation accepts strings in any encoding, but for
some values in non-BINARY encoding, it fails proper length check and
raises an `AddressFamilyError`. Since passing strings in a multibyte
encoding has never worked correctly for years, this patch makes it an
explicit error with an `InvalidAddressError`.

Fixes: https://github.com/ruby/ipaddr/issues/56

https://github.com/ruby/ipaddr/commit/a33fd14d4a
2023-12-25 21:12:49 +09:00
Hiroshi SHIBATA 4fd3c85acd [ruby/ipaddr] Bump up v1.2.6
https://github.com/ruby/ipaddr/commit/247459faa5
2023-12-16 13:20:55 +08:00
Hartley McGuire e581b78ed2 Improve performance of include? by 5-10x
Rails uses IPAddr#include? to evaluate what it should use as the
client's remote ip by filtering potential ips against a trusted list
of internal ips. In a _very_ minimal app, #include? was showing up in
a profile as ~1% of request time.

The issue is that #include? was converting itself and the other value
passed in to ranges of IPAddr. This mean as a worst case (where other is
a non-IPAddr, like a String) then there would be 5 IPAddr instances
created (other -> IPAddr, and two each for the conversions to ranges).
However, wrapping the begin and end values as IPAddr is not needed
because they are necessarily fixed addresses already.

This patch extracts the logic for getting the begin_addr and end_addr
from the #to_range method so that they can be used in #include? without
having to instantiate so many IPAddr.

Benchmark:

```ruby
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")

Benchmark.ips do |x|
  x.report("/24 includes address") { net1.include? net2 }
  x.report("/24 not includes address") { net1.include? net3 }
  x.report("/16 includes /24") { net4.include? net1 }
  x.report("/24 not includes /16") { net1.include? net4 }
  x.compare!
end
```

Before:

```
Comparison:
    /24 not includes /16:   175041.3 i/s
/24 not includes address:   164933.2 i/s - 1.06x  (± 0.00) slower
        /16 includes /24:   163881.9 i/s - 1.07x  (± 0.00) slower
    /24 includes address:   163558.4 i/s - 1.07x  (± 0.00) slower
```

After:

```
Comparison:
    /24 not includes /16:  2588364.9 i/s
/24 not includes address:  1474650.7 i/s - 1.76x  (± 0.00) slower
        /16 includes /24:  1461351.0 i/s - 1.77x  (± 0.00) slower
    /24 includes address:  1425463.5 i/s - 1.82x  (± 0.00) slower
```
2023-09-23 02:22:25 +00:00
Jeremy Evans de51a4a13e [ruby/ipaddr] Consider IPv4-mapped IPv6 addresses private if IPv4 address is private
Fixes [Bug #19479]

https://github.com/ruby/ipaddr/commit/7faa0768d3
2023-06-22 16:40:46 +00:00
Hiroshi SHIBATA 51cfe70135 [ruby/ipaddr] Bump version to 1.2.5
https://github.com/ruby/ipaddr/commit/d92acb3982
2022-12-05 06:32:03 +00:00
rm155 70e6be2b05 [ruby/ipaddr] Improve Ractor-compliance
https://github.com/ruby/ipaddr/commit/73461724e5
2022-09-08 14:09:06 +09:00
Hiroshi SHIBATA 52d3e31d27 [ruby/ipaddr] Bump version to 1.2.4
https://github.com/ruby/ipaddr/commit/6edf6ee6c3
2022-02-10 17:18:05 +09:00
Espartaco Palma 9b768012f6 [ruby/ipaddr] Fix exception calling to_range' after freeze'
https://github.com/ruby/ipaddr/commit/77fe1fca0a
2022-02-10 17:18:05 +09:00
Jean Boussier 100253c7f0 [ruby/ipaddr] Ipaddr#native must also coerce @mask_addr
Before it would be left as an IPv6 mask causing `to_range` to fail.

```
>> IPAddr.new("::2").native.to_range
/opt/rubies/3.0.3/lib/ruby/3.0.0/ipaddr.rb:479:in `set': invalid address (IPAddr::InvalidAddressError)
```

https://github.com/ruby/ipaddr/commit/af485192f3
2022-02-10 17:18:05 +09:00
Jean Boussier 5221cb4468 [ruby/ipaddr] Expose IPAddr::VERSION
An almost universal convention for gems is to expose Namespace::VERSION
which makes it much easier when debugging etc.

https://github.com/ruby/ipaddr/commit/587ae6996e
2022-02-10 17:18:03 +09:00
Jeremy Evans 391d6ab4f7 [ruby/ipaddr] Fix include? and ipv4_mapped to allow drb tests to pass
include? should return false if comparing an IPv4 address to an IPv6
address.

ipv4_mapped needs to set the correct netmask on the mapped
addresses.

https://github.com/ruby/ipaddr/commit/da22ef8e6c
2021-10-11 13:50:54 +09:00
Jeremy Evans 9a321dd9b2 [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

https://github.com/ruby/ipaddr/commit/f45630da31
2021-10-11 13:50:54 +09:00
Jeremy Evans bd6e1a0f08 [ruby/ipaddr] Support zone identifiers in IPv6 addresses
These are supported by Ruby's socket library if the operating system
supports zone indentifiers, so they should be supported by ipaddr.
See RFCs 4007 and 6874 for additional information.

Implements Ruby Feature #10911

https://github.com/ruby/ipaddr/commit/09a6408fb2
2021-10-07 18:22:43 +09:00
Bogdan Irimie 74ed881e10 [ruby/ipaddr] Add netmask method that returns net mask as string.
https://github.com/ruby/ipaddr/commit/283d16f3a3
2021-10-07 18:22:43 +09:00
Jeremy Evans abad5e10e8 [ruby/ipaddr] Disallow leading zeros in mask
https://github.com/ruby/ipaddr/commit/f49d2d49a4
2021-10-07 18:22:43 +09:00
Nobuyoshi Nakada 38da84296c [ruby/ipaddr] Raise if extra slashes follow
https://bugs.ruby-lang.org/issues/15832

https://github.com/ruby/ipaddr/commit/de9805d6fa
2021-10-07 18:22:42 +09:00
Jeremy Evans 54ee22be53 [ruby/ipaddr] Avoid reraising exceptions
Instead of raising a new exception with a modified message, just
use the correct message to begin with.  This avoids the issue with
both exceptions being displayed at error exit.

https://github.com/ruby/ipaddr/commit/09edfd4a7f
2021-10-07 18:22:42 +09:00
Espartaco Palma b23fba91ae [ruby/ipaddr] Removing superfluos assingments & return
Also adding test for ntop

https://github.com/ruby/ipaddr/commit/0ba16cca10
2021-10-07 17:46:00 +09:00
knu ab364fb5a8 Import ipaddr 1.2.2
- Enable frozen_string_literal and do a bit of code cleanup


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66432 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-18 05:09:08 +00:00
knu 236e2993ef Include the input in the message when raising InvalidAddressError
[Feature #5987]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64244 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-08-09 08:40:54 +00:00
shyouhei f2a91397fd Add uplevel keyword to Kernel#warn and use it
If uplevel keyword is given, the warning message is prepended
with caller file and line information and the string "warning: ".
The use of the uplevel keyword makes Kernel#warn format output
similar to how rb_warn formats output.

This patch modifies net/ftp and net/imap to use Kernel#warn
instead of $stderr.puts or $stderr.printf, since they are used
for printing warnings.

This makes lib/cgi/core and tempfile use $stderr.puts instead of
warn for debug logging, since they are used for debug printing
and not for warning.

This does not modify bundler, rubygems, or rdoc, as those are
maintained outside of ruby and probably wish to remain backwards
compatible with older ruby versions.

rb_warn_m code is originally from nobu, but I've changed it
so that it only includes the path and lineno from uplevel
(not the method), and also prepends the string "warning: ",
to make it more similar to rb_warn.

From: Jeremy Evans code@jeremyevans.net
Signed-off-by: Urabe Shyouhei shyouhei@ruby-lang.org


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61155 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-12-12 11:56:25 +00:00