summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2023-04-26 14:17:27 +0200
committerJean Boussier <jean.boussier@gmail.com>2023-04-26 16:54:25 +0200
commit6339cb70c3bcc54696e98c303dd4b26ed3d57afd (patch)
tree5890d2de94b266433b14231f2a3487275b975f18 /marshal.c
parent78be6696d864513ffad395ecd37d582143ca1216 (diff)
downloadruby-6339cb70c3bcc54696e98c303dd4b26ed3d57afd.tar.gz
marshal.c: shallow freeze user objects
When `freeze: true` argument is passed. [Bug #19427]
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/marshal.c b/marshal.c
index cdf25df5aa..712a40347f 100644
--- a/marshal.c
+++ b/marshal.c
@@ -2155,7 +2155,12 @@ r_object_for(struct load_arg *arg, bool partial, int *ivp, VALUE extmod, int typ
marshal_compat_t *compat = (marshal_compat_t*)d;
v = compat->loader(klass, v);
}
- if (!partial) v = r_post_proc(v, arg);
+ if (!partial) {
+ if (arg->freeze) {
+ OBJ_FREEZE(v);
+ }
+ v = r_post_proc(v, arg);
+ }
}
break;
@@ -2180,6 +2185,9 @@ r_object_for(struct load_arg *arg, bool partial, int *ivp, VALUE extmod, int typ
load_funcall(arg, v, s_mload, 1, &data);
v = r_fixup_compat(v, arg);
v = r_copy_ivar(v, data);
+ if (arg->freeze) {
+ OBJ_FREEZE(v);
+ }
v = r_post_proc(v, arg);
if (!NIL_P(extmod)) {
if (oldclass) append_extmod(v, extmod);