mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
bpo-29802: Fix reference counting in module-level struct functions (#1213)
when pass arguments of wrong type.
This commit is contained in:
parent
8f5cdfa9fc
commit
40db90c1ce
4 changed files with 15 additions and 0 deletions
|
@ -599,6 +599,16 @@ class StructTest(unittest.TestCase):
|
||||||
'offset -11 out of range for 10-byte buffer'):
|
'offset -11 out of range for 10-byte buffer'):
|
||||||
struct.pack_into('<B', byte_list, -11, 123)
|
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):
|
class UnpackIteratorTest(unittest.TestCase):
|
||||||
"""
|
"""
|
||||||
Tests for iterative unpacking (struct.Struct.iter_unpack).
|
Tests for iterative unpacking (struct.Struct.iter_unpack).
|
||||||
|
|
|
@ -317,6 +317,9 @@ Extension Modules
|
||||||
Library
|
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-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
|
- bpo-22352: Column widths in the output of dis.dis() are now adjusted for
|
||||||
|
|
|
@ -2083,6 +2083,7 @@ cache_struct_converter(PyObject *fmt, PyObject **ptr)
|
||||||
|
|
||||||
if (fmt == NULL) {
|
if (fmt == NULL) {
|
||||||
Py_DECREF(*ptr);
|
Py_DECREF(*ptr);
|
||||||
|
*ptr = NULL;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3907,6 +3907,7 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
|
||||||
PyObject *output = NULL;
|
PyObject *output = NULL;
|
||||||
if (arg == NULL) {
|
if (arg == NULL) {
|
||||||
Py_DECREF(*(PyObject**)addr);
|
Py_DECREF(*(PyObject**)addr);
|
||||||
|
*(PyObject**)addr = NULL;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue