]> granicus.if.org Git - python/commitdiff
bpo-29802: Fix reference counting in module-level struct functions (#1213)
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 20 Apr 2017 18:19:31 +0000 (21:19 +0300)
committerGitHub <noreply@github.com>
Thu, 20 Apr 2017 18:19:31 +0000 (21:19 +0300)
when pass arguments of wrong type.

Lib/test/test_struct.py
Misc/NEWS
Modules/_struct.c
Objects/unicodeobject.c

index 932ef4737852b93c64e3e2bba614eee79c80429e..02d50b2d1c374e2c489b3a29376ff8905f3b1322 100644 (file)
@@ -599,6 +599,16 @@ class StructTest(unittest.TestCase):
                 'offset -11 out of range for 10-byte buffer'):
             struct.pack_into('<B', byte_list, -11, 123)
 
+    def test_issue29802(self):
+        # When the second argument of struct.unpack() was of wrong type
+        # the Struct object was decrefed twice and the reference to
+        # deallocated object was left in a cache.
+        with self.assertRaises(TypeError):
+            struct.unpack(b'b', 0)
+        # Shouldn't crash.
+        self.assertEqual(struct.unpack(b'b', b'a'), (b'a'[0],))
+
+
 class UnpackIteratorTest(unittest.TestCase):
     """
     Tests for iterative unpacking (struct.Struct.iter_unpack).
index 7e09eff4e0a238724cbdd76667035aa5763a5b6f..fe1b0f839dcc59500683b24290d9206df7970d54 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -317,6 +317,9 @@ Extension Modules
 Library
 -------
 
+- bpo-29802: Fixed reference counting in module-level struct functions when
+  pass arguments of wrong type.
+
 - bpo-30070: Fixed leaks and crashes in errors handling in the parser module.
 
 - bpo-22352: Column widths in the output of dis.dis() are now adjusted for
index 4bc41869234fbba13b8e4f411175a537f3fead64..a614be89d2303641e368863362ad30a56cab2d33 100644 (file)
@@ -2083,6 +2083,7 @@ cache_struct_converter(PyObject *fmt, PyObject **ptr)
 
     if (fmt == NULL) {
         Py_DECREF(*ptr);
+        *ptr = NULL;
         return 1;
     }
 
index ef2215fbc3c7f3af092602106ed560b882ac5913..b68042179f0903222254cee885cf161b14b8eefb 100644 (file)
@@ -3907,6 +3907,7 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
     PyObject *output = NULL;
     if (arg == NULL) {
         Py_DECREF(*(PyObject**)addr);
+        *(PyObject**)addr = NULL;
         return 1;
     }