mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
Address SF #451547. The approach is a bit draconian: any object that
is pickled as a global must now exist by the name under which it is pickled, otherwise the pickling fails. Previously, such things would fail on unpickling, or unpickle as the wrong global object. I'm hoping that this won't break existing code that is playing tricks with this. I need a volunteer to do this for cPickle too.
This commit is contained in:
parent
339d0f720e
commit
b0a98e9c94
@ -497,6 +497,20 @@ class Pickler:
|
||||
except AttributeError:
|
||||
module = whichmodule(object, name)
|
||||
|
||||
try:
|
||||
__import__(module)
|
||||
mod = sys.modules[module]
|
||||
klass = getattr(mod, name)
|
||||
except (ImportError, KeyError, AttributeError):
|
||||
raise PicklingError(
|
||||
"Can't pickle %r: it's not found as %s.%s" %
|
||||
(object, module, name))
|
||||
else:
|
||||
if klass is not object:
|
||||
raise PicklingError(
|
||||
"Can't pickle %r: it's not the same object as %s.%s" %
|
||||
(object, module, name))
|
||||
|
||||
memo_len = len(memo)
|
||||
write(GLOBAL + module + '\n' + name + '\n' +
|
||||
self.put(memo_len))
|
||||
|
Loading…
Reference in New Issue
Block a user