Blame SOURCES/ruby-3.1.0-Don-t-query-RubyVM-FrozenCore-for-class-path.patch

9a8c02
From 0ade5611df9f981005eed32b369d1e699e520221 Mon Sep 17 00:00:00 2001
9a8c02
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
9a8c02
Date: Thu, 10 Feb 2022 13:26:44 +0100
9a8c02
Subject: [PATCH] Don't query `RubyVM::FrozenCore` for class path.
9a8c02
9a8c02
The `RubyVM::FrozenCore` class path is corrupted during GC cycle and
9a8c02
returns random garbage, which might result in segfault.
9a8c02
9a8c02
But since it is easy to detect the `RubyVM::FrozenCore`, just provide
9a8c02
the class path explicitly as a workaround.
9a8c02
9a8c02
Other possibility would be to ignore `RubyVM::FrozenCore` simlarly as
9a8c02
TracePoint API does:
9a8c02
9a8c02
https://github.com/ruby/ruby/blob/46f6575157d4c2f6bbd5693896e26a65037e5552/vm_trace.c#L411
9a8c02
---
9a8c02
 vm.c | 10 +++++++++-
9a8c02
 1 file changed, 9 insertions(+), 1 deletion(-)
9a8c02
9a8c02
diff --git a/vm.c b/vm.c
9a8c02
index 8ce8b279d4..3d189fa63a 100644
9a8c02
--- a/vm.c
9a8c02
+++ b/vm.c
9a8c02
@@ -446,7 +446,15 @@ rb_dtrace_setup(rb_execution_context_t *ec, VALUE klass, ID id,
9a8c02
     }
9a8c02
     type = BUILTIN_TYPE(klass);
9a8c02
     if (type == T_CLASS || type == T_ICLASS || type == T_MODULE) {
9a8c02
-	VALUE name = rb_class_path(klass);
9a8c02
+	VALUE name = Qnil;
9a8c02
+	/*
9a8c02
+	 * Special treatment for rb_mRubyVMFrozenCore wchi is broken by GC.
9a8c02
+         * https://bugs.ruby-lang.org/issues/18257
9a8c02
+	 */
9a8c02
+	if (klass == rb_mRubyVMFrozenCore)
9a8c02
+	    name = rb_str_new_cstr("RubyVM::FrozenCore");
9a8c02
+	else
9a8c02
+	    name = rb_class_path(klass);
9a8c02
 	const char *classname, *filename;
9a8c02
 	const char *methodname = rb_id2name(id);
9a8c02
 	if (methodname && (filename = rb_source_location_cstr(&args->line_no)) != 0) {
9a8c02
-- 
9a8c02
2.34.1
9a8c02