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

if it is called with a sequence or set, but not list or tuple.
(cherry picked from commit f572cbf1fa)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2021-07-13 22:40:10 -07:00 committed by GitHub
parent b42eee78e7
commit 7e1d6308a3
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):
def testFlattenLen(self):
# flatten(<object with no length>)
# Object without length.
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):

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;
if (!_flatten1(&context, item,0))
if (!_flatten1(&context, item, 0)) {
Py_XDECREF(context.tuple);
return NULL;
}
if (_PyTuple_Resize(&context.tuple, context.size))
return NULL;