ml.ruby-lang.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

ruby-core

Thread Start a new thread
Download
Threads by month
  • ----- 2025 -----
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
ruby-core@ml.ruby-lang.org

March 2024

  • 5 participants
  • 258 discussions
[ruby-core:116627] [Ruby master Bug#20246] Unexpected behavior for Regexp in Subexpression Calls on Ruby 3.3.0
by bestwebua (Vladislav Trotsenko) 21 Mar '24

21 Mar '24
Issue #20246 has been reported by bestwebua (Vladislav Trotsenko). ---------------------------------------- Bug #20246: Unexpected behavior for Regexp in Subexpression Calls on Ruby 3.3.0 https://bugs.ruby-lang.org/issues/20246 * Author: bestwebua (Vladislav Trotsenko) * Status: Open * Priority: Normal * ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin22] * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- Hello! A few days ago, after migration on 3.3.0 I have faced with issue inside subexpression calls. An expected result on Ruby up to 3.3.0: ```ruby '1.2.3'[/(\d+)(\.\g<1>){2}/] # => "1.2.3" ``` An actual result on Ruby 3.3.0: ```ruby '1.2.3'[/(\d+)(\.\g<1>){2}/] # => nil ``` -- https://bugs.ruby-lang.org/
3 2
0 0
[ruby-core:116201] [Ruby master Bug#20184] Ruby segfaults on Fly.io with 256 MB RAM
by aalin (Andreas Alin) 20 Mar '24

20 Mar '24
Issue #20184 has been reported by aalin (Andreas Alin). ---------------------------------------- Bug #20184: Ruby segfaults on Fly.io with 256 MB RAM https://bugs.ruby-lang.org/issues/20184 * Author: aalin (Andreas Alin) * Status: Open * Priority: Normal * ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux] * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- I've been running a Ruby 3.2 app on Fly.io with 256 MB RAM and it has been working fine. When I upgraded to Ruby 3.3.0, any Ruby script would crash immediately with a segfault. I haven't been able to reproduce it outside of fly.io. I created a repository with a basic rack app which crashes on fly.io. The readme includes the full output and a GDB backtrace. https://github.com/aalin/ruby-3-3-0-fly-crash -- https://bugs.ruby-lang.org/
5 6
0 0
[ruby-core:115924] [Ruby master Bug#20095] Regex lookahead behaving strangely in 3.3.0
by sisyphus_cg (Sisyphus CG) 20 Mar '24

20 Mar '24
Issue #20095 has been reported by sisyphus_cg (Sisyphus CG). ---------------------------------------- Bug #20095: Regex lookahead behaving strangely in 3.3.0 https://bugs.ruby-lang.org/issues/20095 * Author: sisyphus_cg (Sisyphus CG) * Status: Open * Priority: Normal * ruby -v: 3.3.0 * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- Multiple regex lookaheads seem to behave strangely in 3.3.0: ```ruby p "xxx" =~ /(?=.*x)x(?=banana)/ # 2 ``` Clearly, the string `xxx` does not contain `banana`, so this regex should never match, but it does. -- https://bugs.ruby-lang.org/
5 4
0 0
[ruby-core:116450] [Ruby master Bug#20212] Regex match method is crashing - (irb):6: [BUG] Segmentation fault at 0x0000000000000000 ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin22]
by rubanthilak (Ruban Thilak) 20 Mar '24

20 Mar '24
Issue #20212 has been reported by rubanthilak (Ruban Thilak). ---------------------------------------- Bug #20212: Regex match method is crashing - (irb):6: [BUG] Segmentation fault at 0x0000000000000000 ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin22] https://bugs.ruby-lang.org/issues/20212 * Author: rubanthilak (Ruban Thilak) * Status: Open * Priority: Normal * ruby -v: 3.3.0 * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- Tried this with ruby 3.3.0, both irb and rails console are crashing ```ruby DOMAIN_REGEX = Regexp.new( /\A((?=.*?[a-z])(?!.*--)[a-z\d]+[a-z\d-]*[a-z\d]+).((?=.*?[a-z])(?!.*--)[a-z\d]+[a-z\d-]*[a-z\d]+).((?=.*?[a-z])(?!.*--)[a-zd]+[a-zd-]*[a-zd]+).((?=.*?[a-z])(?!.*--)[a-zd]+[a-zd-]*[a-zd]+)\Z/x ) full_domain = "www.google.com" 100.times.each { full_domain.match(DOMAIN_REGEX) } ``` -- Ruby level backtrace information ---------------------------------------- /Users/rthilak/.rvm/gems/ruby-3.3.0@ams/bin/ruby_executable_hooks:22:in `<main>' /Users/rthilak/.rvm/gems/ruby-3.3.0@ams/bin/ruby_executable_hooks:22:in `eval' /Users/rthilak/.rvm/rubies/ruby-3.3.0/bin/bundle:25:in `<main>' /Users/rthilak/.rvm/rubies/ruby-3.3.0/bin/bundle:25:in `load' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/gems/3.3.0/gems/bundler-2.5.3/exe/bundle:20:in `<top (required)>' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/friendly_errors.rb:117:in `with_friendly_errors' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/gems/3.3.0/gems/bundler-2.5.3/exe/bundle:28:in `block in <top (required)>' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/cli.rb:28:in `start' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor/base.rb:584:in `start' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/cli.rb:34:in `dispatch' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor.rb:527:in `dispatch' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor/command.rb:28:in `run' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/cli.rb:451:in `exec' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/cli/exec.rb:23:in `run' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/cli/exec.rb:58:in `kernel_load' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/bundler/cli/exec.rb:58:in `load' /Users/rthilak/.rvm/rubies/ruby-3.3.0/bin/irb:25:in `<top (required)>' /Users/rthilak/.rvm/rubies/ruby-3.3.0/bin/irb:25:in `load' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/gems/3.3.0/gems/irb-1.11.0/exe/irb:9:in `<top (required)>' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/irb.rb:903:in `start' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/irb.rb:1001:in `run' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/irb.rb:1001:in `catch' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/irb.rb:1002:in `block in run' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/irb.rb:1015:in `eval_input' /Users/rthilak/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/irb.rb:1093:in `each_top_level_statement' <internal:kernel>:187:in `loop' ---Files-------------------------------- trace.txt (61.7 KB) -- https://bugs.ruby-lang.org/
4 3
0 0
[ruby-core:116395] [Ruby master Bug#20207] Segmentation fault for a regexp containing positive and negative lookaheads
by Sundeep (Sundeep Agarwal) 20 Mar '24

20 Mar '24
Issue #20207 has been reported by Sundeep (Sundeep Agarwal). ---------------------------------------- Bug #20207: Segmentation fault for a regexp containing positive and negative lookaheads https://bugs.ruby-lang.org/issues/20207 * Author: Sundeep (Sundeep Agarwal) * Status: Open * Priority: Normal * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- I'm getting segmentation fault for the following regexp with Ruby 3.3.0: ``` ruby puts 'clan'.match?(/(?=.*a)(?!.*n)/) ``` This is the minimal example for which I was able to produce the issue. `a` and `n` in the above example are just a sample, can be other character combinations too. There has to be at least two characters before them in the input string (`cl` in the above example). The error is seen when the above code is run from a file, but only occasionally from irb. When run from a file, most of the time I get segmentation fault (see attached log file), but sometimes I get the following error: ``` ruby lookaround.rb:1:in `match?': undefined bytecode (bug): /(?=.*a)(?!.*n)/ (RegexpError) from lookaround.rb:1:in `<main>' ``` When asked in the r/ruby forum, somebody else was able to reproduce this issue. They also mentioned that the issue wasn't seen in the Ruby 3.2.2 version. ---Files-------------------------------- lookaround_segfault.log (15.9 KB) -- https://bugs.ruby-lang.org/
6 6
0 0
[ruby-core:117267] [Ruby master Feature#19057] Hide implementation of `rb_io_t`.
by Eregon (Benoit Daloze) 20 Mar '24

20 Mar '24
Issue #19057 has been updated by Eregon (Benoit Daloze). Re beauty of the implementation this change is more than that, we can see in https://github.com/ruby/ruby/pull/10283/files that `rb_io_t` exposes way too much internals, which in turns prevents changing/evolving these internals without affecting extensions, can easily break ABI unintentionally, can have negative performance impact, etc. It's also rather brittle with the internal duplicate definition of rb_io_t, and could easily cause segfaults if the structs don't match (e.g. when working on this code and then wasting a bunch of time due to that, or maybe subtle enough that the CI would not catch and it would only be found later). I hope we can still land this change, if it needs to wait 3.5 or so then that sounds a good compromise. ---------------------------------------- Feature #19057: Hide implementation of `rb_io_t`. https://bugs.ruby-lang.org/issues/19057#change-107392 * Author: ioquatix (Samuel Williams) * Status: Assigned * Assignee: ioquatix (Samuel Williams) * Target version: 3.4 ---------------------------------------- In order to make improvements to the IO implementation like <https://bugs.ruby-lang.org/issues/18455>, we need to add new fields to `struct rb_io_t`. By the way, ending types in `_t` is not recommended by POSIX, so I'm also trying to rename the internal implementation to drop `_t` where possible during this conversion. Anyway, we should try to hide the implementation of `struct rb_io`. Ideally, we don't expose any of it, but the problem is backwards compatibility. So, in order to remain backwards compatibility, we should expose some fields of `struct rb_io`, the most commonly used one is `fd` and `mode`, but several others are commonly used. There are many fields which should not be exposed because they are implementation details. ## Current proposal The current proposed change <https://github.com/ruby/ruby/pull/6511> creates two structs: ```c // include/ruby/io.h #ifndef RB_IO_T struct rb_io { int fd; // ... public fields ... }; #else struct rb_io; #endif // internal/io.h #define RB_IO_T struct rb_io { int fd; // ... public fields ... // ... private fields ... }; ``` However, we are not 100% confident this is safe according to the C specification. My experience is not sufficiently wide to say this is safe in practice, but it does look okay to both myself, and @Eregon + @tenderlovemaking have both given some kind of approval. That being said, maybe it's not safe. There are two alternatives: ## Hide all details We can make public `struct rb_io` completely invisible. ```c // include/ruby/io.h #define RB_IO_HIDDEN struct rb_io; int rb_ioptr_descriptor(struct rb_io *ioptr); // accessor for previously visible state. // internal/io.h struct rb_io { // ... all fields ... }; ``` This would only be forwards compatible, and code would need to feature detect like this: ```c #ifdef RB_IO_HIDDEN #define RB_IOPTR_DESCRIPTOR rb_ioptr_descriptor #else #define RB_IOPTR_DESCRIPTOR(ioptr) rb_ioptr_descriptor(ioptr) #endif ``` ## Nested public interface Alternatively, we can nest the public fields into the private struct: ```c // include/ruby/io.h struct rb_io_public { int fd; // ... public fields ... }; // internal/io.h #define RB_IO_T struct rb_io { struct rb_io_public public; // ... private fields ... }; ``` ## Considerations I personally think the "Hide all details" implementation is the best, but it's also the lest compatible. This is also what we are ultimately aiming for, whether we decide to take an intermediate "compatibility step" is up to us. I think "Nested public interface" is messy and introduces more complexity, but it might be slightly better defined than the "Current proposal" which might create undefined behaviour. That being said, all the tests are passing. -- https://bugs.ruby-lang.org/
1 0
0 0
[ruby-core:117262] [Ruby master Feature#19057] Hide implementation of `rb_io_t`.
by mame (Yusuke Endoh) 20 Mar '24

20 Mar '24
Issue #19057 has been updated by mame (Yusuke Endoh). ioquatix (Samuel Williams) wrote in #note-43: > Here is the revert PR: https://github.com/ruby/ruby/pull/10283 Thanks! Just FYI, I think the precedence in Ruby's decision is basically: * beauty of the language (conciseness and intuitiveness for users) >= compatibility > runtime performance and efficiency >>> beauty of the implementation (simplicity for the core developers). Compared to the past, compatibility has become much more of a priority, and performance has become somewhat more important. The order is sometimes reversed in rare cases, but the beauty of the implementation has always been the lowest priority. The "beauty of the implementation", such as hiding the rb_io_t implementation, can beat "compatibility" only in limited and special cases, e.g., only when there is no other way at all, or when the practical impact is very small (no affected gem is identified, or it is only an issue with minor gems). In this case, unicorn, which is undeniably an important gem and still part of the Ruby ecosystem, is affected and there are known implementation workarounds. In that case, there is no reason not to choose the workaround. ---------------------------------------- Feature #19057: Hide implementation of `rb_io_t`. https://bugs.ruby-lang.org/issues/19057#change-107355 * Author: ioquatix (Samuel Williams) * Status: Assigned * Assignee: ioquatix (Samuel Williams) * Target version: 3.4 ---------------------------------------- In order to make improvements to the IO implementation like <https://bugs.ruby-lang.org/issues/18455>, we need to add new fields to `struct rb_io_t`. By the way, ending types in `_t` is not recommended by POSIX, so I'm also trying to rename the internal implementation to drop `_t` where possible during this conversion. Anyway, we should try to hide the implementation of `struct rb_io`. Ideally, we don't expose any of it, but the problem is backwards compatibility. So, in order to remain backwards compatibility, we should expose some fields of `struct rb_io`, the most commonly used one is `fd` and `mode`, but several others are commonly used. There are many fields which should not be exposed because they are implementation details. ## Current proposal The current proposed change <https://github.com/ruby/ruby/pull/6511> creates two structs: ```c // include/ruby/io.h #ifndef RB_IO_T struct rb_io { int fd; // ... public fields ... }; #else struct rb_io; #endif // internal/io.h #define RB_IO_T struct rb_io { int fd; // ... public fields ... // ... private fields ... }; ``` However, we are not 100% confident this is safe according to the C specification. My experience is not sufficiently wide to say this is safe in practice, but it does look okay to both myself, and @Eregon + @tenderlovemaking have both given some kind of approval. That being said, maybe it's not safe. There are two alternatives: ## Hide all details We can make public `struct rb_io` completely invisible. ```c // include/ruby/io.h #define RB_IO_HIDDEN struct rb_io; int rb_ioptr_descriptor(struct rb_io *ioptr); // accessor for previously visible state. // internal/io.h struct rb_io { // ... all fields ... }; ``` This would only be forwards compatible, and code would need to feature detect like this: ```c #ifdef RB_IO_HIDDEN #define RB_IOPTR_DESCRIPTOR rb_ioptr_descriptor #else #define RB_IOPTR_DESCRIPTOR(ioptr) rb_ioptr_descriptor(ioptr) #endif ``` ## Nested public interface Alternatively, we can nest the public fields into the private struct: ```c // include/ruby/io.h struct rb_io_public { int fd; // ... public fields ... }; // internal/io.h #define RB_IO_T struct rb_io { struct rb_io_public public; // ... private fields ... }; ``` ## Considerations I personally think the "Hide all details" implementation is the best, but it's also the lest compatible. This is also what we are ultimately aiming for, whether we decide to take an intermediate "compatibility step" is up to us. I think "Nested public interface" is messy and introduces more complexity, but it might be slightly better defined than the "Current proposal" which might create undefined behaviour. That being said, all the tests are passing. -- https://bugs.ruby-lang.org/
1 0
0 0
[ruby-core:116431] [Ruby master Bug#20209] YJIT can leak memory by retaining objects with singleton class
by alanwu (Alan Wu) 20 Mar '24

20 Mar '24
Issue #20209 has been reported by alanwu (Alan Wu). ---------------------------------------- Bug #20209: YJIT can leak memory by retaining objects with singleton class https://bugs.ruby-lang.org/issues/20209 * Author: alanwu (Alan Wu) * Status: Closed * Priority: Normal * Backport: 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED ---------------------------------------- We've received [reports](https://github.com/ruby/ruby/pull/9693) of YJIT causing memory leaks in production Rails apps by keeping objects that have singleton classes alive. The symptom is similar to #19436. We have found a workaround with https://github.com/ruby/ruby/pull/9693 and would like to have it in the next 3.3 point release. -- https://bugs.ruby-lang.org/
2 2
0 0
[ruby-core:116399] [Ruby master Bug#20208] Net::HTTP errors with Errno::EAFNOSUPPORT when setting local_host with Addrinfo
by jprokop (Jarek Prokop) 20 Mar '24

20 Mar '24
Issue #20208 has been reported by jprokop (Jarek Prokop). ---------------------------------------- Bug #20208: Net::HTTP errors with Errno::EAFNOSUPPORT when setting local_host with Addrinfo https://bugs.ruby-lang.org/issues/20208 * Author: jprokop (Jarek Prokop) * Status: Open * Priority: Normal * ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux] * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- 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/d2ba8ea54a4089959afdeecdd963e3c4ff39174… 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/
4 8
0 0
[ruby-core:116451] [Ruby master Bug#20213] zsuper with keyword splat without explicit keywords incorrectly uses mutable keyword splat
by jeremyevans0 (Jeremy Evans) 20 Mar '24

20 Mar '24
Issue #20213 has been reported by jeremyevans0 (Jeremy Evans). ---------------------------------------- Bug #20213: zsuper with keyword splat without explicit keywords incorrectly uses mutable keyword splat https://bugs.ruby-lang.org/issues/20213 * Author: jeremyevans0 (Jeremy Evans) * Status: Open * Priority: Normal * Backport: 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED ---------------------------------------- As the subject states, the super call in this code is compiled incorrectly: ```ruby extend(Module.new{def a(**k) k[:a] = 1 end}) extend(Module.new{def a(**k) p k; super; p k end}) a # Expected output, actual output on Ruby 2.0-3.2: {} {} # Actual output on Ruby 3.3 and master {} {:a=>1} ``` The zsuper call here uses VM_CALL_KW_SPLAT_MUT: ``` invokesuper <calldata!argc:1, FCALL|SUPER|ZSUPER|KW_SPLAT|KW_SPLAT_MUT>, nil ``` That is not correct, because as the example shows, if the super method accepts a keyword splat, the super method can modify the keyword splat, and changes are reflected in the caller. I submitted a pull request to fix this: https://github.com/ruby/ruby/pull/9710, and marked this for backporting to 3.3. -- https://bugs.ruby-lang.org/
2 2
0 0
  • ← Newer
  • 1
  • ...
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • ...
  • 26
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.