зеркало из https://github.com/github/ruby.git
merge revision(s) 7bd7aee02e303de27d2cddfc5ef47e612d6782cb: [Backport #18464]
Fix interpreter crash caused by RUBY_INTERNAL_EVENT_NEWOBJ + Ractors When a Ractor is created whilst a tracepoint for RUBY_INTERNAL_EVENT_NEWOBJ is active, the interpreter crashes. This is because during the early setup of the Ractor, the stdio objects are created, which allocates Ruby objects, which fires the tracepoint. However, the tracepoint machinery tries to dereference the control frame (ec->cfp->pc), which isn't set up yet and so crashes with a null pointer dereference. Fix this by not firing GC tracepoints if cfp isn't yet set up. --- gc.c | 1 + test/objspace/test_ractor.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 test/objspace/test_ractor.rb
This commit is contained in:
Родитель
0c00fb5d92
Коммит
b422c3523c
1
gc.c
1
gc.c
|
@ -2474,6 +2474,7 @@ rb_objspace_set_event_hook(const rb_event_flag_t event)
|
|||
static void
|
||||
gc_event_hook_body(rb_execution_context_t *ec, rb_objspace_t *objspace, const rb_event_flag_t event, VALUE data)
|
||||
{
|
||||
if (UNLIKELY(!ec->cfp)) return;
|
||||
const VALUE *pc = ec->cfp->pc;
|
||||
if (pc && VM_FRAME_RUBYFRAME_P(ec->cfp)) {
|
||||
/* increment PC because source line is calculated with PC-1 */
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
require "test/unit"
|
||||
|
||||
class TestObjSpaceRactor < Test::Unit::TestCase
|
||||
def test_tracing_does_not_crash
|
||||
assert_ractor(<<~RUBY, require: 'objspace')
|
||||
ObjectSpace.trace_object_allocations do
|
||||
r = Ractor.new do
|
||||
obj = 'a' * 1024
|
||||
Ractor.yield obj
|
||||
end
|
||||
|
||||
r.take
|
||||
r.take
|
||||
end
|
||||
RUBY
|
||||
end
|
||||
end
|
|
@ -11,7 +11,7 @@
|
|||
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
|
||||
#define RUBY_VERSION_TEENY 2
|
||||
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
|
||||
#define RUBY_PATCHLEVEL 58
|
||||
#define RUBY_PATCHLEVEL 59
|
||||
|
||||
#include "ruby/version.h"
|
||||
#include "ruby/internal/abi.h"
|
||||
|
|
Загрузка…
Ссылка в новой задаче