Project

General

Profile

Actions

Backport #8276

closed

Marshal.load modifies restored object after calling #marshal_load

Added by Eregon (Benoit Daloze) about 11 years ago. Updated almost 8 years ago.


Description

Given this code, a simple class freezing instances on creation (so they are immutable):

class T
def initialize(data)
@data = data
freeze
end

def marshal_dump
@data
end

def marshal_load data
initialize(data)
end
end

t = T.new("dd")
s = Marshal.dump(t)
p Marshal.load(s) # => ...:in `load': can't modify frozen T (RuntimeError)

Freezing on creation from Marshal is needed to ensure immutability and it seems the right place to do it.
It used to work (ruby 2.0.0dev (2012-07-15 trunk 36395) [x86_64-darwin10.8.0] did fine).
The backtrace:

(gdb) bt
#0 rb_raise (exc=4304355040, fmt=0x1001be828 "can't modify frozen %s") at error.c:1810
#1 0x000000010004344f in rb_error_frozen (what=<value temporarily unavailable, due to optimizations>) at error.c:2020
#2 0x0000000100004600 in rb_enc_associate_index (obj=<value temporarily unavailable, due to optimizations>, idx=1) at encoding.c:749
#3 0x000000010008233b in r_ivar (obj=4320803800, has_encoding=0x0, arg=0x1006b84b0) at marshal.c:1374
#4 0x00000001000811f1 in r_object0 (arg=0x1006b84b0, ivp=<value temporarily unavailable, due to optimizations>, extmod=8) at marshal.c:1475
#5 0x00000001000821ad in r_object [inlined] () at /Users/benoitdaloze/EREGONMS/Ruby/git/ruby/marshal.c:1890
#6 0x00000001000821ad in marshal_load (argc=<value temporarily unavailable, due to optimizations>, argv=<value temporarily unavailable, due to optimizations>) at marshal.c:1978
...

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0