mirror of
https://github.com/python/cpython
synced 2026-09-28 07:48:19 +03: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
1 changed files with 14 additions and 0 deletions
|
|
@ -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…
Add table
Add a link
Reference in a new issue