From 5fa12dafa8cb8f7158452356611967880745bba5 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sat, 28 Mar 2020 13:03:17 +0100 Subject: [PATCH] The last argument of rb_rescue2() should always be (VALUE)0 * Otherwise it might segfault, since C has no idea of the type of varargs, and the C code must assume all varargs are VALUE. --- eval.c | 2 +- ext/-test-/cxxanyargs/cxxanyargs.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/eval.c b/eval.c index a68c26a2d6..b472fec83c 100644 --- a/eval.c +++ b/eval.c @@ -974,7 +974,7 @@ rb_rescue2(VALUE (* b_proc) (VALUE), VALUE data1, /*! * \copydoc rb_rescue2 - * \param[in] args exception classes, terminated by 0. + * \param[in] args exception classes, terminated by (VALUE)0. */ VALUE rb_vrescue2(VALUE (* b_proc) (VALUE), VALUE data1, diff --git a/ext/-test-/cxxanyargs/cxxanyargs.cpp b/ext/-test-/cxxanyargs/cxxanyargs.cpp index 30790696db..cafd7f5bf7 100644 --- a/ext/-test-/cxxanyargs/cxxanyargs.cpp +++ b/ext/-test-/cxxanyargs/cxxanyargs.cpp @@ -181,13 +181,13 @@ namespace test_rb_rescue2 { test(VALUE self) { #ifdef HAVE_NULLPTR - rb_rescue2(RUBY_METHOD_FUNC(begin), self, nullptr, self, rb_eStandardError, rb_eFatal, 0); - rb_rescue2(begin, self, nullptr, self, rb_eStandardError, rb_eFatal, 0); + rb_rescue2(RUBY_METHOD_FUNC(begin), self, nullptr, self, rb_eStandardError, rb_eFatal, (VALUE)0); + rb_rescue2(begin, self, nullptr, self, rb_eStandardError, rb_eFatal, (VALUE)0); #endif rb_rescue2(RUBY_METHOD_FUNC(begin), self, RUBY_METHOD_FUNC(rescue), self, - rb_eStandardError, rb_eFatal, 0); // old - return rb_rescue2(begin, self, rescue, self, rb_eStandardError, rb_eFatal, 0); // new + rb_eStandardError, rb_eFatal, (VALUE)0); // old + return rb_rescue2(begin, self, rescue, self, rb_eStandardError, rb_eFatal, (VALUE)0); // new } }