From fda83cd2d6f7622fcef18e79070ecf5cc726b16d Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 21 Jul 2026 13:35:05 +0900 Subject: [PATCH 1/4] Promote Ripper DSL array elements to VALUE Ensure arguments passed through `rb_ary_new_from_args` have type `VALUE`, including when the statement-expression optimization is unavailable. This avoids undefined behavior in variadic calls. --- ext/ripper/tools/dsl.rb | 3 ++- test/ripper/test_ripper.rb | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ext/ripper/tools/dsl.rb b/ext/ripper/tools/dsl.rb index 38f859dd97ed61..9b8796442cfcfd 100644 --- a/ext/ripper/tools/dsl.rb +++ b/ext/ripper/tools/dsl.rb @@ -37,7 +37,8 @@ def to_s if empty? "rb_ary_new()" else - "rb_ary_new_from_args(#{size}, #{map(&:to_s).join(', ')})" + values = map {|value| "(VALUE)0|(#{value})"} + "rb_ary_new_from_args(#{size}, #{values.join(', ')})" end end end diff --git a/test/ripper/test_ripper.rb b/test/ripper/test_ripper.rb index 2b3421d8270a8a..4baca69b57daf9 100644 --- a/test/ripper/test_ripper.rb +++ b/test/ripper/test_ripper.rb @@ -225,3 +225,12 @@ def state(name) Ripper::Lexer::State.new(Ripper.const_get(name)) end end if ripper_test + +class TestRipper::DSL < Test::Unit::TestCase + def test_array_elements_are_values + require_relative "../../ext/ripper/tools/dsl" + + code = DSL.line?("/*% ripper: [$:$, 0] %*/").generate + assert_include(code, "rb_ary_new_from_args(2, (VALUE)0|(p->s_lvalue), (VALUE)0|(0))") + end +end if ripper_test From 403200c900cf8d2d68bc1323b40817222116587f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 21 Jul 2026 17:23:43 +0900 Subject: [PATCH 2/4] Inspect socket credentials only when the structures are defined Specifically, on macOS, while `SCM_CREDS` is defined, the definition of `struct cmsgcred` is disabled. --- ext/socket/ancdata.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c index 0e17d9e87383ce..c584a0bd193fb0 100644 --- a/ext/socket/ancdata.c +++ b/ext/socket/ancdata.c @@ -706,8 +706,14 @@ anc_inspect_passcred_credentials(int level, int type, VALUE data, VALUE ret) } #endif -#if defined(SCM_CREDS) -#define INSPECT_SCM_CREDS +#if !defined(SCM_CREDS) +#elif defined(HAVE_TYPE_STRUCT_CMSGCRED) /* FreeBSD */ +# define INSPECT_SCM_CREDS +#elif defined(HAVE_TYPE_STRUCT_SOCKCRED) /* FreeBSD, NetBSD */ +# define INSPECT_SCM_CREDS +#endif + +#ifdef INSPECT_SCM_CREDS static int anc_inspect_socket_creds(int level, int type, VALUE data, VALUE ret) { From 630f604dc4159970f5d83ceb498f377b03e8515d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 21 Jul 2026 11:34:00 +0900 Subject: [PATCH 3/4] Remove unreachable require of io/wait in socket.rb IO#wait_writable is defined in core since Ruby 3.2, so this guard never requires io/wait when running on the ruby built from this tree. Co-Authored-By: Claude Fable 5 --- ext/socket/lib/socket.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ext/socket/lib/socket.rb b/ext/socket/lib/socket.rb index 465b74964f9b22..a091320c486531 100644 --- a/ext/socket/lib/socket.rb +++ b/ext/socket/lib/socket.rb @@ -2,11 +2,6 @@ require 'socket.so' -unless IO.method_defined?(:wait_writable, false) - # It's only required on older Rubies < v3.2: - require 'io/wait' -end - class Addrinfo # creates an Addrinfo object from the arguments. # From 812738f94074ae6fffa017933aa5bcdd05a15014 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 21 Jul 2026 19:04:26 +0900 Subject: [PATCH 4/4] [ruby/rubygems] Pend on more transient network errors in TestGemBundledCA The rescue list misses Errno::ECONNRESET, which ruby/ruby CI hits during SSL_connect every few days, turning a whole test-all job red. Treat connection resets and truncated responses like the other transient network failures this test already pends on. https://github.com/ruby/rubygems/commit/d76587e0c9 Co-Authored-By: Claude Fable 5 --- test/rubygems/test_bundled_ca.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/rubygems/test_bundled_ca.rb b/test/rubygems/test_bundled_ca.rb index cc8fa884cacdf9..308a736686b4f8 100644 --- a/test/rubygems/test_bundled_ca.rb +++ b/test/rubygems/test_bundled_ca.rb @@ -33,7 +33,8 @@ def assert_https(host) http.verify_mode = OpenSSL::SSL::VERIFY_PEER http.cert_store = bundled_certificate_store http.get("/") - rescue Errno::ENOENT, Errno::ETIMEDOUT, SocketError, Gem::Net::OpenTimeout + rescue Errno::ENOENT, Errno::ETIMEDOUT, Errno::ECONNRESET, Errno::ECONNREFUSED, + EOFError, SocketError, Gem::Net::OpenTimeout pend "#{host} seems offline, I can't tell whether ssl would work." rescue OpenSSL::SSL::SSLError => e # Only fail for certificate verification errors