From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Wed, 14 Jul 2021 05:44:08 +0000 (-0700) Subject: bpo-44608: Fix memory leak in _tkinter._flatten() (GH-27107) X-Git-Tag: v3.9.7~159 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=94adfe6e2cdc9ba715b6d7068d8bd521ba6bf30b;p=thirdparty%2FPython%2Fcpython.git 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 f572cbf1faab33d9afbbe3e95738ed6fbe6e48e6) Co-authored-by: Serhiy Storchaka --- diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 0bbb39b147ea..fa974d181136 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -41,8 +41,14 @@ def get_tk_patchlevel(): class TkinterTest(unittest.TestCase): def testFlattenLen(self): - # flatten() + # 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): diff --git a/Misc/NEWS.d/next/Library/2021-07-13-09-01-33.bpo-44608.R3IcM1.rst b/Misc/NEWS.d/next/Library/2021-07-13-09-01-33.bpo-44608.R3IcM1.rst new file mode 100644 index 000000000000..e0cf948f3cba --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-07-13-09-01-33.bpo-44608.R3IcM1.rst @@ -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. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index b7958ea627b4..19853ce49118 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -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;