diff options
author | Alexandre Vassalotti <alexandre@peadrop.com> | 2013-11-30 21:52:35 (GMT) |
---|---|---|
committer | Alexandre Vassalotti <alexandre@peadrop.com> | 2013-11-30 21:52:35 (GMT) |
commit | 896414fedf5e882345aca177d63da72bf6d8209a (patch) | |
tree | 561c2d1ce67206d64ae15ec79a28fe868efcce4f | |
parent | 1a83070d9e5e6f88fb422d442ad88574db63cb93 (diff) | |
download | cpython-896414fedf5e882345aca177d63da72bf6d8209a.zip cpython-896414fedf5e882345aca177d63da72bf6d8209a.tar.gz cpython-896414fedf5e882345aca177d63da72bf6d8209a.tar.bz2 |
Fixed _pickle.Unpickler to handle empty persistent IDs correctly.
-rw-r--r-- | Lib/test/pickletester.py | 40 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_pickle.c | 2 |
3 files changed, 26 insertions, 19 deletions
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 052290d..86869e1 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -1499,30 +1499,34 @@ class AbstractPersistentPicklerTests(unittest.TestCase): 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): @@ -21,6 +21,9 @@ Library - 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 index bc3b406..d862ae8 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4665,7 +4665,7 @@ load_persid(UnpicklerObject *self) 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); |