]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-92955: fix memory leak in code object lines and positions iterators (gh-92956)
authorKumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
Thu, 19 May 2022 13:55:22 +0000 (19:25 +0530)
committerGitHub <noreply@github.com>
Thu, 19 May 2022 13:55:22 +0000 (22:55 +0900)
Misc/NEWS.d/next/Core and Builtins/2022-05-19-13-25-50.gh-issue-92955.kmNV33.rst [new file with mode: 0644]
Objects/codeobject.c
Objects/object.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-19-13-25-50.gh-issue-92955.kmNV33.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-19-13-25-50.gh-issue-92955.kmNV33.rst
new file mode 100644 (file)
index 0000000..09f03e5
--- /dev/null
@@ -0,0 +1 @@
+Fix memory leak in code object's lines and positions iterators as they were not finalized at exit. Patch by Kumar Aditya.
index c2b29be1fe86931a3a32cfd0cdf8d5fa844530f1..68b0b1efb2e14c4b35d761a2ec1807c208a741e9 100644 (file)
@@ -1096,7 +1096,7 @@ error:
     return result;
 }
 
-static PyTypeObject LineIterator = {
+PyTypeObject _PyLineIterator = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "line_iterator",                    /* tp_name */
     sizeof(lineiterator),               /* tp_basicsize */
@@ -1142,7 +1142,7 @@ static PyTypeObject LineIterator = {
 static lineiterator *
 new_linesiterator(PyCodeObject *code)
 {
-    lineiterator *li = (lineiterator *)PyType_GenericAlloc(&LineIterator, 0);
+    lineiterator *li = (lineiterator *)PyType_GenericAlloc(&_PyLineIterator, 0);
     if (li == NULL) {
         return NULL;
     }
@@ -1196,7 +1196,7 @@ positionsiter_next(positionsiterator* pi)
         _source_offset_converter, &pi->pi_endcolumn);
 }
 
-static PyTypeObject PositionsIterator = {
+PyTypeObject _PyPositionsIterator = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "positions_iterator",               /* tp_name */
     sizeof(positionsiterator),          /* tp_basicsize */
@@ -1242,7 +1242,7 @@ static PyTypeObject PositionsIterator = {
 static PyObject*
 code_positionsiterator(PyCodeObject* code, PyObject* Py_UNUSED(args))
 {
-    positionsiterator* pi = (positionsiterator*)PyType_GenericAlloc(&PositionsIterator, 0);
+    positionsiterator* pi = (positionsiterator*)PyType_GenericAlloc(&_PyPositionsIterator, 0);
     if (pi == NULL) {
         return NULL;
     }
index c9bb60eaed87c1a7cd03e68e57e1ffdb5d7d7076..95045ed03d5dbc4469ef6caae5d6b9b9281416c3 100644 (file)
@@ -1846,6 +1846,8 @@ extern PyTypeObject PyHKEY_Type;
 #endif
 extern PyTypeObject _Py_GenericAliasIterType;
 extern PyTypeObject _PyMemoryIter_Type;
+extern PyTypeObject _PyLineIterator;
+extern PyTypeObject _PyPositionsIterator;
 
 static PyTypeObject* static_types[] = {
     // The two most important base types: must be initialized first and
@@ -1944,12 +1946,14 @@ static PyTypeObject* static_types[] = {
     &_PyHamt_CollisionNode_Type,
     &_PyHamt_Type,
     &_PyInterpreterID_Type,
+    &_PyLineIterator,
     &_PyManagedBuffer_Type,
     &_PyMemoryIter_Type,
     &_PyMethodWrapper_Type,
     &_PyNamespace_Type,
     &_PyNone_Type,
     &_PyNotImplemented_Type,
+    &_PyPositionsIterator,
     &_PyUnicodeASCIIIter_Type,
     &_PyUnion_Type,
     &_PyWeakref_CallableProxyType,