[Python-checkins] cpython (3.3): Fixed _pickle.Unpickler to handle empty persistent IDs correctly.

alexandre.vassalotti python-checkins at python.org
Sat Nov 30 22:56:31 CET 2013


http://hg.python.org/cpython/rev/b92f9eaedb76
changeset:   87656:b92f9eaedb76
branch:      3.3
parent:      87652:96d1207d33d0
user:        Alexandre Vassalotti <alexandre at peadrop.com>
date:        Sat Nov 30 13:52:35 2013 -0800
summary:
  Fixed _pickle.Unpickler to handle empty persistent IDs correctly.

files:
  Lib/test/pickletester.py |  40 +++++++++++++++------------
  Misc/NEWS                |   3 ++
  Modules/_pickle.c        |   2 +-
  3 files changed, 26 insertions(+), 19 deletions(-)


diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -1499,30 +1499,34 @@
         if isinstance(object, int) and object % 2 == 0:
             self.id_count += 1
             return str(object)
+        elif object == "test_false_value":
+            self.false_count += 1
+            return ""
         else:
             return None
 
     def persistent_load(self, oid):
-        self.load_count += 1
-        object = int(oid)
-        assert object % 2 == 0
-        return object
+        if not oid:
+            self.load_false_count += 1
+            return "test_false_value"
+        else:
+            self.load_count += 1
+            object = int(oid)
+            assert object % 2 == 0
+            return object
 
     def test_persistence(self):
-        self.id_count = 0
-        self.load_count = 0
-        L = list(range(10))
-        self.assertEqual(self.loads(self.dumps(L)), L)
-        self.assertEqual(self.id_count, 5)
-        self.assertEqual(self.load_count, 5)
-
-    def test_bin_persistence(self):
-        self.id_count = 0
-        self.load_count = 0
-        L = list(range(10))
-        self.assertEqual(self.loads(self.dumps(L, 1)), L)
-        self.assertEqual(self.id_count, 5)
-        self.assertEqual(self.load_count, 5)
+        L = list(range(10)) + ["test_false_value"]
+        for proto in protocols:
+            self.id_count = 0
+            self.false_count = 0
+            self.load_false_count = 0
+            self.load_count = 0
+            self.assertEqual(self.loads(self.dumps(L, proto)), L)
+            self.assertEqual(self.id_count, 5)
+            self.assertEqual(self.false_count, 1)
+            self.assertEqual(self.load_count, 5)
+            self.assertEqual(self.load_false_count, 1)
 
 
 class AbstractPicklerUnpicklerObjectTests(unittest.TestCase):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,9 @@
 - Issue #19088: Fixed incorrect caching of the copyreg module in
   object.__reduce__() and object.__reduce_ex__().
 
+- Fixed _pickle.Unpickler to not fail when loading empty strings as
+  persistent IDs.
+
 - Issue #11508: Fixed uuid.getnode() and uuid.uuid1() on environment with
   virtual interface.  Original patch by Kent Frazier.
 
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -4665,7 +4665,7 @@
     if (self->pers_func) {
         if ((len = _Unpickler_Readline(self, &s)) < 0)
             return -1;
-        if (len < 2)
+        if (len < 1)
             return bad_readline();
 
         pid = PyBytes_FromStringAndSize(s, len - 1);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list