]> granicus.if.org Git - python/commitdiff
#4298: pickle.load() can segfault on invalid or truncated input.
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 11 Nov 2008 20:05:06 +0000 (20:05 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 11 Nov 2008 20:05:06 +0000 (20:05 +0000)
Patch and test by Hirokazu Yamamoto.

Lib/test/pickletester.py
Misc/NEWS
Modules/_pickle.c

index 8519fb538e93215b45d560918dcd5e791107452d..c7c89d1509b695eb75eb9d26937c8c6e73844432 100644 (file)
@@ -1032,6 +1032,11 @@ class AbstractPickleModuleTests(unittest.TestCase):
         self.assertRaises(pickle.PicklingError, BadPickler().dump, 0)
         self.assertRaises(pickle.UnpicklingError, BadUnpickler().load)
 
+    def test_bad_input(self):
+        # Test issue4298
+        s = bytes([0x58, 0, 0, 0, 0x54])
+        self.assertRaises(EOFError, pickle.loads, s)
+
 
 class AbstractPersistentPicklerTests(unittest.TestCase):
 
index 36095e09019663402cfcea294fce89aa39662fe6..3a8f4678e9ed80f3deffc2547ea0785711ab1871 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -16,7 +16,9 @@ Core and Builtins
 Library
 -------
 
-- Issue #4283: fix a left-over "iteritems" call in distutils.
+- Issue #4298: Fix a segfault when pickle.loads is passed a ill-formed input.
+
+- Issue #4283: Fix a left-over "iteritems" call in distutils.
 
 Build
 -----
index a689c3320bd981a664d0a5c2e63c199b26421389..c1facd8381398687425ac4254bf165b2e6ee2f54 100644 (file)
@@ -489,6 +489,11 @@ unpickler_read(UnpicklerObject *self, char **s, Py_ssize_t n)
         return -1;
     }
 
+    if (PyBytes_GET_SIZE(data) != n) {
+        PyErr_SetNone(PyExc_EOFError);
+        return -1;
+    }
+
     Py_XDECREF(self->last_string);
     self->last_string = data;