[New-bugs-announce] [issue5370] unpickling vs. __getattr__

Mike Meyer report at bugs.python.org
Wed Feb 25 22:26:16 CET 2009


New submission from Mike Meyer <mwm at users.sourceforge.net>:

The attached short file causes all of python 2.5, 2.6 and 3.0 to drop
into infinite recursion trying to unpickle the created object, but the
2.5 version has the cleanest The problem appears to be that the unpickle
code (C in 3.0; Python in 2.5 - I assume the others are similar) uses
getattr to try and get the __setstate__ method (if any) of the opject
being built before it's dictionary is populated. This causes the
invocation of the __getattr__ method, which tries to use the
non-existent "attrs" attribute, thus starting the recursion.

A simple workaround is to provide this:

  def __setstate__(self, data):
      self.__dict__.update(data)

but methinks that either 1) the interpreter shouldn't be falling into
the infinite loop in this case, or 2) the pickle code should be using
hasattr to check for the attribute (which won't trigger this problem)
before trying getattr on it.

----------
files: pickletest.py
messages: 82721
nosy: mwm
severity: normal
status: open
title: unpickling vs. __getattr__
type: behavior
versions: Python 2.5, Python 2.6, Python 3.0
Added file: http://bugs.python.org/file13179/pickletest.py

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue5370>
_______________________________________


More information about the New-bugs-announce mailing list