[#51136] [Ruby master Bug#18489] Segmentation fault with ruby 3.1.0 in `active_decorator` — "t_mimura (Tomohiko Mimura)" <noreply@...>

Issue #18489 has been reported by t_mimura (Tomohiko Mimura).

11 messages 2022/01/14

[ruby-dev:51147] [Ruby master Bug#18497] Fiber内でProcess.daemonをするとSegmentation faultが起こる

From: "nobu (Nobuyoshi Nakada)" <noreply@...>
Date: 2022-01-19 14:34:25 UTC
List: ruby-dev #51147
Issue #18497 has been updated by nobu (Nobuyoshi Nakada).=0D
=0D
=0D
In 2.7 or earlier, commit:bf3b2a43741e or the following patch is also neede=
d.=0D
```diff=0D
diff --git a/cont.c b/cont.c=0D
index 7f971a9e9d5..50403b8258d 100644=0D
--- a/cont.c=0D
+++ b/cont.c=0D
@@ -1930,7 +1930,7 @@ fiber_current(void)=0D
 }=0D
=20=0D
 static inline rb_fiber_t*=0D
-return_fiber(void)=0D
+return_fiber(bool terminate)=0D
 {=0D
     rb_fiber_t *fiber =3D fiber_current();=0D
     rb_fiber_t *prev =3D fiber->prev;=0D
@@ -1941,7 +1941,7 @@ return_fiber(void)=0D
=20=0D
         VM_ASSERT(root_fiber !=3D NULL);=0D
=20=0D
-        if (root_fiber =3D=3D fiber) {=0D
+        if (!terminate && root_fiber =3D=3D fiber) {=0D
             rb_raise(rb_eFiberError, "can't yield from root fiber");=0D
         }=0D
         return root_fiber;=0D
@@ -2087,7 +2087,7 @@ rb_fiber_terminate(rb_fiber_t *fiber, int need_interr=
upt)=0D
     fiber->cont.machine.stack =3D NULL;=0D
     fiber->cont.machine.stack_size =3D 0;=0D
=20=0D
-    next_fiber =3D return_fiber();=0D
+    next_fiber =3D return_fiber(true);=0D
     if (need_interrupt) RUBY_VM_SET_INTERRUPT(&next_fiber->cont.saved_ec);=0D
     fiber_switch(next_fiber, 1, &value, 0, RB_NO_KEYWORDS);=0D
 }=0D
@@ -2121,13 +2121,13 @@ rb_fiber_resume(VALUE fiber_value, int argc, const =
VALUE *argv)=0D
 VALUE=0D
 rb_fiber_yield_kw(int argc, const VALUE *argv, int kw_splat)=0D
 {=0D
-    return fiber_switch(return_fiber(), argc, argv, 0, kw_splat);=0D
+    return fiber_switch(return_fiber(false), argc, argv, 0, kw_splat);=0D
 }=0D
=20=0D
 VALUE=0D
 rb_fiber_yield(int argc, const VALUE *argv)=0D
 {=0D
-    return fiber_switch(return_fiber(), argc, argv, 0, RB_NO_KEYWORDS);=0D
+    return fiber_switch(return_fiber(false), argc, argv, 0, RB_NO_KEYWORDS=
);=0D
 }=0D
=20=0D
 void=0D
```=0D
=0D
----------------------------------------=0D
Bug #18497: Fiber=E5=86=85=E3=81=A7Process.daemon=E3=82=92=E3=81=99=E3=82=
=8B=E3=81=A8Segmentation fault=E3=81=8C=E8=B5=B7=E3=81=93=E3=82=8B=0D
https://bugs.ruby-lang.org/issues/18497#change-96055=0D
=0D
* Author: sevenc-nanashi (Nanashi. @sevenc-nanashi)=0D
* Status: Closed=0D
* Priority: Normal=0D
* ruby -v: ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [aarch64-linux]=0D
* Backport: 2.6: REQUIRED, 2.7: REQUIRED, 3.0: REQUIRED, 3.1: REQUIRED=0D
----------------------------------------=0D
```=0D
ruby -e 'Fiber.new { Process.daemon true, true }.resume'=0D
```=0D
=0D
OCI=E3=81=AEUbuntu=EF=BC=88`ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [=
aarch64-linux]`=EF=BC=89=E3=81=A7=E7=A2=BA=E8=AA=8D=E5=87=BA=E6=9D=A5=E3=81=
=BE=E3=81=97=E3=81=9F=E3=81=8C=E3=80=81WSL=EF=BC=88`ruby 3.1.0p0 (2021-12-2=
5 revision fb4df44d16) [x86_64-linux]`=EF=BC=89=E3=81=A7=E3=81=AF=E7=A2=BA=
=E8=AA=8D=E5=87=BA=E6=9D=A5=E3=81=BE=E3=81=9B=E3=82=93=E3=81=A7=E3=81=97=E3=
=81=9F=E3=80=82=0D
=0D
=0D
---Files--------------------------------=0D
sf.log (17 KB)=0D
=0D
=0D
--=20=0D
https://bugs.ruby-lang.org/=0D

In This Thread