[#117021] [Ruby master Feature#20318] Pattern matching `case ... in` support for triple-dot arguments — "bradgessler (Brad Gessler) via ruby-core" <ruby-core@...>

Issue #20318 has been reported by bradgessler (Brad Gessler).

11 messages 2024/03/01

[#117027] [Ruby master Bug#20319] Singleton class is being frozen lazily in some cases — "andrykonchin (Andrew Konchin) via ruby-core" <ruby-core@...>

Issue #20319 has been reported by andrykonchin (Andrew Konchin).

8 messages 2024/03/01

[#117036] [Ruby master Bug#20321] `require': cannot load such file — "Justman10000 (Justin Nogossek) via ruby-core" <ruby-core@...>

Issue #20321 has been reported by Justman10000 (Justin Nogossek).

14 messages 2024/03/01

[#117067] [Ruby master Feature#20326] Add an `undefined` for use as a default argument. — "shan (Shannon Skipper) via ruby-core" <ruby-core@...>

Issue #20326 has been reported by shan (Shannon Skipper).

7 messages 2024/03/06

[#117115] [Ruby master Feature#20331] Should parser warn hash duplication and when clause? — "yui-knk (Kaneko Yuichiro) via ruby-core" <ruby-core@...>

Issue #20331 has been reported by yui-knk (Kaneko Yuichiro).

11 messages 2024/03/12

[#117147] [Ruby master Feature#20335] `Thread.each_caller_location` should accept the same arguments as `caller` and `caller_locations` — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20335 has been reported by byroot (Jean Boussier).

13 messages 2024/03/14

[#117157] [Ruby master Misc#20336] DevMeeting-2024-04-17 — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #20336 has been reported by mame (Yusuke Endoh).

15 messages 2024/03/14

[#117212] [Ruby master Feature#20345] Add `--target-rbconfig` option to mkmf — "katei (Yuta Saito) via ruby-core" <ruby-core@...>

Issue #20345 has been reported by katei (Yuta Saito).

9 messages 2024/03/18

[#117240] [Ruby master Feature#20350] Return chilled string from Symbol#to_s — "Dan0042 (Daniel DeLorme) via ruby-core" <ruby-core@...>

Issue #20350 has been reported by Dan0042 (Daniel DeLorme).

10 messages 2024/03/19

[#117288] [Ruby master Misc#20387] Meta-ticket for ASAN support — "kjtsanaktsidis (KJ Tsanaktsidis) via ruby-core" <ruby-core@...>

Issue #20387 has been reported by kjtsanaktsidis (KJ Tsanaktsidis).

10 messages 2024/03/22

[#117321] [Ruby master Bug#20393] `after_fork_ruby` clears all pending interrupts for both parent and child process. — "ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>

Issue #20393 has been reported by ioquatix (Samuel Williams).

6 messages 2024/03/26

[#117324] [Ruby master Feature#20394] Add an offset parameter to `String#to_i` — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20394 has been reported by byroot (Jean Boussier).

16 messages 2024/03/26

[#117341] [Ruby master Feature#20396] ObjectSpace.dump_all(string_value: false): skip dumping the String contents — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20396 has been reported by byroot (Jean Boussier).

8 messages 2024/03/27

[#117390] [Ruby master Feature#20404] `2pi` — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #20404 has been reported by mame (Yusuke Endoh).

9 messages 2024/03/31

[ruby-core:117260] [Ruby master Bug#20208] Net::HTTP errors with Errno::EAFNOSUPPORT when setting local_host with Addrinfo

From: "naruse (Yui NARUSE) via ruby-core" <ruby-core@...>
Date: 2024-03-20 12:53:54 UTC
List: ruby-core #117260
Issue #20208 has been updated by naruse (Yui NARUSE).

Backport changed from 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED to 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: DONE

ruby_3_3 606dd03e9b0d4cf65ef56e52fab063e3ed5ef797.

----------------------------------------
Bug #20208: Net::HTTP errors with Errno::EAFNOSUPPORT when setting local_host with Addrinfo
https://bugs.ruby-lang.org/issues/20208#change-107353

* Author: jprokop (Jarek Prokop)
* Status: Closed
* Assignee: kjtsanaktsidis (KJ Tsanaktsidis)
* ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
* Backport: 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: DONE
----------------------------------------
A bug was found when dealing with Ruby tests downstream. One of our builders has a specific networking configuration, resulting in Ruby incorrectly binding a socket, resulting in exception Errno::EAFNOSUPPORT,
despite localhost being IPv6 capable.

It is reproducible with Ruby 3.3, and reasonably current master (git hash a846d391d38b34fcc4f90adef967c166c923bd56).

Reproduction environment:
The networking configuration has to be in a specific state. The regular interface (such as eth0) has to have ipv6 disabled while localhost is IPv6 enabled.

I have tracked the problem to a commit adding AI_ADDRCONFIG flag: https://github.com/ruby/ruby/commit/d2ba8ea54a4089959afdeecdd963e3c4ff391748#diff-0a5f5e9afd3efff0444a367dd88aac41bb4de9765c8542b81c1ebcff60ab3b14R99
If I revert the commit or just simply set 2 ifdefs that are present in the diff with `HAVE_CONST_AI_ADDRCONFIG` to 0, the problem no longer occurs.

I have used vagrant with fedora/39-cloud-base box with the above mentioned git hash. However, I'd note that I reproduced it also on RHEL 8 and RHEL 9.

The VM has the following interfaces:
~~~
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:e3:aa:c1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 192.168.122.209/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
       valid_lft 2099sec preferred_lft 2099sec
    inet6 fe80::f5fe:e8a4:8f83:4a8f/64 scope link tentative noprefixroute
       valid_lft forever preferred_lft forever
~~~

Disable IPv6 of eth0 and leave only lo with IPv6:
~~~
$ sudo sysctl "net.ipv6.conf.eth0.disable_ipv6=1"
~~~

Confirm the result:
~~~
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:e3:aa:c1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 192.168.122.209/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
       valid_lft 3587sec preferred_lft 3587sec
~~~
inet6 is no longer present on eth0, but still present in lo.

Then we can copy what TestNetHTTPLocalBind is doing in setup, as that is one of the failing tests and use it for a reproducer:
~~~
$ ruby -rnet/http -e 'http = Net::HTTP.new("localhost", 8080); http.local_host = Addrinfo.tcp("localhost", 8080).ip_address; p http.get("/")'
/usr/share/ruby/net/http.rb:1603:in `initialize': Failed to open TCP connection to localhost:8080 (Address family not supported by protocol - bind(2) for "::1" port ) (Errno::EAFNOSUPPORT)
	from /usr/share/ruby/net/http.rb:1603:in `open'
	from /usr/share/ruby/net/http.rb:1603:in `block in connect'
	from /usr/share/ruby/timeout.rb:186:in `block in timeout'
	from /usr/share/ruby/timeout.rb:193:in `timeout'
	from /usr/share/ruby/net/http.rb:1601:in `connect'
	from /usr/share/ruby/net/http.rb:1580:in `do_start'
	from /usr/share/ruby/net/http.rb:1569:in `start'
	from /usr/share/ruby/net/http.rb:2297:in `request'
	from /usr/share/ruby/net/http.rb:1917:in `get'
	from -e:1:in `<main>'
/usr/share/ruby/net/http.rb:1603:in `initialize': Address family not supported by protocol - bind(2) for "::1" port  (Errno::EAFNOSUPPORT)
	from /usr/share/ruby/net/http.rb:1603:in `open'
	from /usr/share/ruby/net/http.rb:1603:in `block in connect'
	from /usr/share/ruby/timeout.rb:186:in `block in timeout'
	from /usr/share/ruby/timeout.rb:193:in `timeout'
	from /usr/share/ruby/net/http.rb:1601:in `connect'
	from /usr/share/ruby/net/http.rb:1580:in `do_start'
	from /usr/share/ruby/net/http.rb:1569:in `start'
	from /usr/share/ruby/net/http.rb:2297:in `request'
	from /usr/share/ruby/net/http.rb:1917:in `get'
	from -e:1:in `<main>'
~~~

The script:
~~~
http = Net::HTTP.new("localhost", 8080)
http.local_host = Addrinfo.tcp("localhost", 8080).ip_address

p http.get("/")
~~~
Without setting the `http.local_host` attribute using Addrinfo, the reproducer does not fail with EAFNOSUPPORT. Whether `port` is specified or `nil` does not make a difference.
Whether there is a server listening on 8080 or not does not make a difference, the script fails with the errno regardless. 

I have collected `strace` that points to a possible cause:
~~~
$ strace ruby -rnet/http -e 'http = Net::HTTP.new("localhost", 8080); http.local_host = Addrinfo.tcp("localhost", 8080).ip_address; p http.get("/")' 2>&1 | grep AF_INET
socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 5
bind(5, {sa_family=AF_INET6, sin6_port=htons(0), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_scope_id=0}, 28) = -1 EAFNOSUPPORT (Address family not supported by protocol)
~~~
A socket is created with AF_INET and later is bound with AF_INET6, that is not correct behavior as far as I can tell.
Full strace is attached.


Observed failures in Ruby test suite related to this issue:
~~~
109) Error:
TestNetHTTPLocalBind#test_bind_to_local_port:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:37337 (Address family not supported by protocol - bind(2) for "::1" port 45395)
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1282:in `test_bind_to_local_port'
110) Error:
TestNetHTTPLocalBind#test_bind_to_local_host:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:46329 (Address family not supported by protocol - bind(2) for "::1" port )
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1267:in `test_bind_to_local_host'
111) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_false:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:41749 (Address family not supported by protocol - bind(2) for "::1" port )
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1312:in `test_response_body_encoding_false'
112) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_string_without_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:42775 (Address family not supported by protocol - bind(2) for "::1" port )
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1330:in `test_response_body_encoding_string_without_content_type'
113) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_true_with_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:36895 (Address family not supported by protocol - bind(2) for "::1" port )
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1324:in `test_response_body_encoding_true_with_content_type'
114) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_encoding_without_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:37115 (Address family not supported by protocol - bind(2) for "::1" port )
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1336:in `test_response_body_encoding_encoding_without_content_type'
115) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_true_without_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:37799 (Address family not supported by protocol - bind(2) for "::1" port )
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
    /builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
    /builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1318:in `test_response_body_encoding_true_without_content_type'
~~~
Related failures from specs:
~~~
1)
An exception occurred during: before :each
TCPSocket#local_address using IPv6 using an implicit hostname the returned Addrinfo uses the correct IP address ERROR
Errno::ECONNREFUSED: Connection refused - connect(2) for nil port 37121
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:59:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:59:in `new'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:59:in `block (4 levels) in <top (required)>'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:4:in `<top (required)>'
2)
An exception occurred during: before :each
TCPSocket#remote_address using IPv6 using an implicit hostname the returned Addrinfo uses the correct IP address ERROR
Errno::ECONNREFUSED: Connection refused - connect(2) for nil port 39823
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:58:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:58:in `new'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:58:in `block (4 levels) in <top (required)>'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:4:in `<top (required)>'
~~~


---Files--------------------------------
strace_log.txt (304 KB)


-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/

In This Thread

Prev Next