bpo-44608: Fix memory leak in _tkinter._flatten() (GH-27107)

if it is called with a sequence or set, but not list or tuple.
This commit is contained in:
Serhiy Storchaka 2021-07-14 08:19:18 +03:00 committed by GitHub
parent 81989058de
commit f572cbf1fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 2 deletions

View File

@ -43,8 +43,14 @@ def get_tk_patchlevel():
class TkinterTest(unittest.TestCase): class TkinterTest(unittest.TestCase):
def testFlattenLen(self): def testFlattenLen(self):
# flatten(<object with no length>) # Object without length.
self.assertRaises(TypeError, _tkinter._flatten, True) self.assertRaises(TypeError, _tkinter._flatten, True)
# Object with length, but not sequence.
self.assertRaises(TypeError, _tkinter._flatten, {})
# Sequence or set, but not tuple or list.
# (issue44608: there were leaks in the following cases)
self.assertRaises(TypeError, _tkinter._flatten, 'string')
self.assertRaises(TypeError, _tkinter._flatten, {'set'})
class TclTest(unittest.TestCase): class TclTest(unittest.TestCase):

View File

@ -0,0 +1,2 @@
Fix memory leak in :func:`_tkinter._flatten` if it is called with a sequence
or set, but not list or tuple.

View File

@ -3197,8 +3197,10 @@ _tkinter__flatten(PyObject *module, PyObject *item)
context.size = 0; context.size = 0;
if (!_flatten1(&context, item,0)) if (!_flatten1(&context, item, 0)) {
Py_XDECREF(context.tuple);
return NULL; return NULL;
}
if (_PyTuple_Resize(&context.tuple, context.size)) if (_PyTuple_Resize(&context.tuple, context.size))
return NULL; return NULL;