From b0a98e9c9462237706578a5180c0f83abd13a1fa Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 17 Aug 2001 18:49:52 +0000 Subject: [PATCH] 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. --- Lib/pickle.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Lib/pickle.py b/Lib/pickle.py index c92dac276c6..8be7a8d3621 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -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))