summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2026-03-26 08:34:22 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2026-03-26 08:34:22 +0900
commitacfdc0ac885ea4641f2e7d9d966fbb2acca7c883 (patch)
treee20126f72ea2a84b7bd95e128e525b24207624fa
parentfecabc31458dc5ec6880550ee094476ce0f8044c (diff)
merge revision(s) 54c4694994cc3bcfea9058b22ba3e68af6aaf740: [Backport #21961]
[PATCH] marshal.c: properly freeze linked strings [Bug #21961]
-rw-r--r--marshal.c3
-rw-r--r--test/ruby/test_marshal.rb14
-rw-r--r--version.h2
3 files changed, 18 insertions, 1 deletions
diff --git a/marshal.c b/marshal.c
index fca246664e..4538249307 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1880,6 +1880,9 @@ r_object_for(struct load_arg *arg, bool partial, int *ivp, VALUE extmod, int typ
}
v = (VALUE)link;
if (!st_lookup(arg->partial_objects, (st_data_t)v, &link)) {
+ if (arg->freeze && RB_TYPE_P(v, T_STRING)) {
+ v = rb_str_to_interned_str(v);
+ }
v = r_post_proc(v, arg);
}
break;
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 2c5985f1d7..4d26eb3a76 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -971,5 +971,19 @@ class TestMarshal < Test::Unit::TestCase
refute_predicate Object, :frozen?
refute_predicate Kernel, :frozen?
end
+
+ def test_linked_strings_are_frozen
+ str = "test"
+ str.instance_variable_set(:@self, str)
+ source = [str, str]
+
+ objects = Marshal.load(encode(source), freeze: true)
+ assert_predicate objects[0], :frozen?
+ assert_predicate objects[1], :frozen?
+ assert_same objects[0], objects[1]
+ assert_same objects[0], objects[0].instance_variable_get(:@self)
+ assert_same objects[1], objects[1].instance_variable_get(:@self)
+ assert_same objects[0].instance_variable_get(:@self), objects[1].instance_variable_get(:@self)
+ end
end
end
diff --git a/version.h b/version.h
index 627e065c3b..71a6c68213 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 10
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 203
+#define RUBY_PATCHLEVEL 204
#include "ruby/version.h"
#include "ruby/internal/abi.h"