Project

General

Profile

Actions

Bug #17338

closed

ruby-spec stuck in "C-API Kernel function rb_rescue2"

Added by vo.x (Vit Ondruch) over 3 years ago. Updated about 3 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 3.0.0dev (2020-11-20 master 1f7b557890) [i386-linux]
[ruby-core:100981]

Description

Trying to build Ruby on Fedora Rawhide, the ruby-spec test suite gets stuck on some platforms (I noticed this on i686 and ppc64le) somewhere around:

C-API Kernel function rb_rescue2
- only rescues if one of the passed exceptions is raised

I have tried to disable the last test listed via -P 'only rescues if one of the passed exceptions is raised' but the test suite is stuck again. My next suspect is 1.


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #17305: rb_rescue2() seems to loop forever if given a non-module for rescued exceptions on <= 2.6.6ClosedActions

Updated by vo.x (Vit Ondruch) over 3 years ago

So the -P 'raises TypeError if one of the passed exceptions is not a Module' helps, that means this is related to #17305.

Actions #2

Updated by vo.x (Vit Ondruch) over 3 years ago

  • Related to Bug #17305: rb_rescue2() seems to loop forever if given a non-module for rescued exceptions on <= 2.6.6 added

Updated by jeremyevans0 (Jeremy Evans) over 3 years ago

  • Status changed from Open to Feedback

I suspect this may be due to the TypeError occurring during the rescue handling. One possibility is to preprocess the list of exception classes to make sure they are all classes or modules. This is different than the ruby-level rescue clause, which doesn't execute the rescue list expression unless an exception is raised, but since rb_rescue2 needs to be passed a va_list of VALUEs, it may be acceptable.

Can you try this patch and see if it fixes the issue:

diff --git a/eval.c b/eval.c
index 55ac8b4eac..1b05d3a10a 100644
--- a/eval.c
+++ b/eval.c
@@ -1012,6 +1012,15 @@ rb_vrescue2(VALUE (* b_proc) (VALUE), VALUE data1,
     rb_control_frame_t *volatile cfp = ec->cfp;
     volatile VALUE result = Qfalse;
     volatile VALUE e_info = ec->errinfo;
+    VALUE eclass;
+    va_list args_check;
+
+    va_copy(args_check, args);
+    while ((eclass = va_arg(args_check, VALUE)) != 0) {
+        if (!(RB_TYPE_P(eclass, T_CLASS) || RB_TYPE_P(eclass, T_MODULE))) {
+           rb_raise(rb_eTypeError, "class or module required");
+        }
+    }

     EC_PUSH_TAG(ec);
     if ((state = EC_EXEC_TAG()) == TAG_NONE) {
@@ -1032,7 +1041,6 @@ rb_vrescue2(VALUE (* b_proc) (VALUE), VALUE data1,

        if (state == TAG_RAISE) {
            int handle = FALSE;
-           VALUE eclass;

            while ((eclass = va_arg(args, VALUE)) != 0) {
                if (rb_obj_is_kind_of(ec->errinfo, eclass)) {

This uses va_copy, which should be acceptable now because it is in C99. https://bugs.ruby-lang.org/projects/ruby-master/wiki/C99 links to a work around that can be used in Ruby <2.7 (before we switched to allowing C99 features), in case we need to backport this to Ruby 2.6.

Updated by jeremyevans0 (Jeremy Evans) about 3 years ago

  • Status changed from Feedback to Closed

I think @nobu (Nobuyoshi Nakada) fixed this issue a different way in 97cf290063ab940d08819cd96cbcca0ef6d50e4c. If this is still an issue, please reopen.

Updated by vo.x (Vit Ondruch) about 3 years ago

  • Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN to 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: REQUIRED

jeremyevans0 (Jeremy Evans) wrote in #note-4:

I think @nobu (Nobuyoshi Nakada) fixed this issue a different way in 97cf290063ab940d08819cd96cbcca0ef6d50e4c. If this is still an issue, please reopen.

Thx for pointing this. It helps it seems. I have used the whole PR#4159 which seems to make the backport a bit easier.

Updated by naruse (Yui NARUSE) about 3 years ago

  • Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: REQUIRED to 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: DONE

ruby_3_0 8ac6ff27566e9c55a2594a081949154b94618256 merged revision(s) 0d89aedb734372bc35d8a569a992d13e86e7923e,a6f5f3cccda381ae332aaa6467f2644611371fb5,97cf290063ab940d08819cd96cbcca0ef6d50e4c.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0