Skip to content

Commit

Permalink
Marshal.load: also freeze extended objects
Browse files Browse the repository at this point in the history
[Bug #19427]

The `proc` wouldn't be called either, that fixes both.
  • Loading branch information
byroot committed Feb 13, 2023
1 parent bc6e587 commit 7ddcee5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
1 change: 1 addition & 0 deletions marshal.c
Expand Up @@ -1865,6 +1865,7 @@ r_object_for(struct load_arg *arg, bool partial, int *ivp, VALUE extmod, int typ
rb_extend_object(v, m);
}
}
v = r_leave(v, arg, partial);
}
break;

Expand Down
20 changes: 20 additions & 0 deletions spec/ruby/core/marshal/shared/load.rb
Expand Up @@ -69,6 +69,18 @@
Object.should_not.frozen?
end

ruby_bug "#19427", ""..."3.3" do
it "does freeze extended objects" do
object = Marshal.load("\x04\be:\x0FEnumerableo:\vObject\x00", freeze: true)
object.should.frozen?
end

it "does freeze extended objects with instance variables" do
object = Marshal.load("\x04\be:\x0FEnumerableo:\vObject\x06:\n@ivarT", freeze: true)
object.should.frozen?
end
end

describe "when called with a proc" do
it "call the proc with frozen objects" do
arr = []
Expand Down Expand Up @@ -132,6 +144,14 @@
end
end

ruby_bug "#19427", ""..."3.3" do
it "call the proc with extended objects" do
objs = []
obj = Marshal.load("\x04\be:\x0FEnumerableo:\vObject\x00", Proc.new { |o| objs << o; o })
objs.should == [obj]
end
end

it "returns the value of the proc" do
Marshal.send(@method, Marshal.dump([1,2]), proc { [3,4] }).should == [3,4]
end
Expand Down

0 comments on commit 7ddcee5

Please sign in to comment.