Backport #8043

Marshal will dump some object with singleton methods

Added by Marc-Andre Lafortune about 1 year ago. Updated about 1 year ago.

[ruby-core:53206]
Status:Closed
Priority:Normal
Assignee:Tomoyuki Chikanaga

Description

=begin
The check for "dumpability" is incorrect:

o = Object.new
def o.foo; end
Marshal.dump(o) # => TypeError: singleton can't be dumped
o.singleton_class.send :prepend, Enumerable
Marshal.dump(o) # => "\x04\be:\x0FEnumerablee:\vObjecto;\x06\0", should fail

=end

Associated revisions

Revision 40087
Added by Tomoyuki Chikanaga about 1 year ago

merge revision(s) 39650: [Backport #8043]

* marshal.c (w_extended): check for prepended object.
   [Bug #8043]

History

#1 Updated by Nobuyoshi Nakada about 1 year ago

  • Description updated (diff)

But extended objects are allowed, aren't they?

#2 Updated by Marc-Andre Lafortune about 1 year ago

My understanding is that objects whose singleton classes have included / prepended classes should be dumpable & loadable, but if the singleton class itself has proper instance methods it can't be dumped.

In the example I gave, the first TypeError is ok, since o's singleton class has a :foo method.

Prepending a module should not make it suddenly dumpable.

The check for this is in w_extended is incorrect. If I'm not mistaken, it assumes that the singleton class is first in the ancestry chain, which is no longer necessarily the case.

#3 Updated by Nobuyoshi Nakada about 1 year ago

Thank you, I misread that `o' would be different object.
I'll fix it.

#4 Updated by Nobuyoshi Nakada about 1 year ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r39650.
Marc-Andre, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


marshal.c: check for prepended

  • marshal.c (w_extended): check for prepended object. [Bug #8043]

#5 Updated by Nobuyoshi Nakada about 1 year ago

  • Tracker changed from Bug to Backport
  • Project changed from ruby-trunk to Backport200
  • Category deleted (core)
  • Status changed from Closed to Assigned
  • Assignee set to Tomoyuki Chikanaga
  • Target version deleted (2.1.0)

#6 Updated by Tomoyuki Chikanaga about 1 year ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r40087.
Marc-Andre, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


merge revision(s) 39650: [Backport #8043]

* marshal.c (w_extended): check for prepended object.
   [Bug #8043]

Also available in: Atom PDF