diff options
| author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2026-03-26 08:34:22 +0900 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2026-03-26 08:34:22 +0900 |
| commit | acfdc0ac885ea4641f2e7d9d966fbb2acca7c883 (patch) | |
| tree | e20126f72ea2a84b7bd95e128e525b24207624fa | |
| parent | fecabc31458dc5ec6880550ee094476ce0f8044c (diff) | |
merge revision(s) 54c4694994cc3bcfea9058b22ba3e68af6aaf740: [Backport #21961]
[PATCH] marshal.c: properly freeze linked strings
[Bug #21961]
| -rw-r--r-- | marshal.c | 3 | ||||
| -rw-r--r-- | test/ruby/test_marshal.rb | 14 | ||||
| -rw-r--r-- | version.h | 2 |
3 files changed, 18 insertions, 1 deletions
@@ -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 @@ -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" |
