[前][次][番号順一覧][スレッド一覧]

ruby-changes:73717

From: nagachika <ko1@a...>
Date: Sun, 25 Sep 2022 13:43:40 +0900 (JST)
Subject: [ruby-changes:73717] 720de2008c (ruby_3_1): merge revision(s) 65ae2bb2e045aa8b668d3c30515f5a6cb3eb68ad: [Backport #18902]

https://git.ruby-lang.org/ruby.git/commit/?id=720de2008c

From 720de2008ca06edb22e5ad7d1432fee4f2575e00 Mon Sep 17 00:00:00 2001
From: nagachika <nagachika@r...>
Date: Sun, 25 Sep 2022 12:33:30 +0900
Subject: merge revision(s) 65ae2bb2e045aa8b668d3c30515f5a6cb3eb68ad: [Backport
 #18902]

	Thread#value: handle threads killed by a fork

	[Bug #18902]

	When a thread is killed because we forked, the `value` if left
	to `Qundef`. Returning it woudl crash the VM.
	---
	 test/ruby/test_thread.rb | 14 ++++++++++++++
	 thread.c                 |  4 ++++
	 2 files changed, 18 insertions(+)
---
 test/ruby/test_thread.rb | 14 ++++++++++++++
 thread.c                 |  4 ++++
 version.h                |  4 ++--
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb
index ddfeb8b7a8..41cee124be 100644
--- a/test/ruby/test_thread.rb
+++ b/test/ruby/test_thread.rb
@@ -1244,6 +1244,20 @@ q.pop https://github.com/ruby/ruby/blob/trunk/test/ruby/test_thread.rb#L1244
     assert_predicate(status, :success?, bug9751)
   end if Process.respond_to?(:fork)
 
+  def test_fork_value
+    bug18902 = "[Bug #18902]"
+    th = Thread.start { sleep 2 }
+    begin
+      pid = fork do
+        th.value
+      end
+      _, status = Process.wait2(pid)
+      assert_predicate(status, :success?, bug18902)
+    ensure
+      th.kill
+    end
+  end if Process.respond_to?(:fork)
+
   def test_fork_while_locked
     m = Thread::Mutex.new
     thrs = []
diff --git a/thread.c b/thread.c
index 9476a7986a..de29340713 100644
--- a/thread.c
+++ b/thread.c
@@ -1364,6 +1364,10 @@ thread_value(VALUE self) https://github.com/ruby/ruby/blob/trunk/thread.c#L1364
 {
     rb_thread_t *th = rb_thread_ptr(self);
     thread_join(th, Qnil, 0);
+    if (th->value == Qundef) {
+        // If the thread is dead because we forked th->value is still Qundef.
+        return Qnil;
+    }
     return th->value;
 }
 
diff --git a/version.h b/version.h
index 032ac88273..56ae0ef9b9 100644
--- a/version.h
+++ b/version.h
@@ -11,11 +11,11 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L11
 # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
 #define RUBY_VERSION_TEENY 3
 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 56
+#define RUBY_PATCHLEVEL 57
 
 #define RUBY_RELEASE_YEAR 2022
 #define RUBY_RELEASE_MONTH 9
-#define RUBY_RELEASE_DAY 20
+#define RUBY_RELEASE_DAY 25
 
 #include "ruby/version.h"
 
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]