From abf68ce16474a2d252723099f1c7a6d640191123 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 11 Sep 2014 10:57:13 +0300 Subject: Issue #21951: Fixed a crash in Tkinter on AIX when called Tcl command with empty string or tuple argument. On some platforms Tcl memory allocator returns NULL when allocating zero-sized block of memory. --- Lib/test/test_tcl.py | 3 ++- Misc/NEWS | 3 +++ Modules/_tkinter.c | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 7485e58..da8f629 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -416,7 +416,6 @@ class TclTest(unittest.TestCase): self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') - @unittest.skipIf(sys.platform.startswith("aix"), 'Issue #21951: crashes on AIX') def test_user_command(self): result = None def testfunc(arg): @@ -444,9 +443,11 @@ class TclTest(unittest.TestCase): check('string') check('string\xbd') check('string\u20ac') + check('') check(b'string', 'string') check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') check(b'string\xbd', 'string\xbd') + check(b'', '') check('str\x00ing') check('str\x00ing\xbd') check('str\x00ing\u20ac') diff --git a/Misc/NEWS b/Misc/NEWS index 6668877..dddcf76 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Core and Builtins Library ------- +- Issue #21951: Fixed a crash in Tkinter on AIX when called Tcl command with + empty string or tuple argument. + - Issue #21951: Tkinter now most likely raises MemoryError instead of crash if the memory allocation fails. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 7871dec..6d777d3 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -899,6 +899,8 @@ AsObj(PyObject *value) Py_ssize_t size, i; size = PyTuple_Size(value); + if (size == 0) + return Tcl_NewListObj(0, NULL); if (!CHECK_SIZE(size, sizeof(Tcl_Obj *))) { PyErr_SetString(PyExc_OverflowError, "tuple is too long"); return NULL; @@ -925,6 +927,8 @@ AsObj(PyObject *value) inbuf = PyUnicode_DATA(value); size = PyUnicode_GET_LENGTH(value); + if (size == 0) + return Tcl_NewUnicodeObj((const void *)"", 0); if (!CHECK_SIZE(size, sizeof(Tcl_UniChar))) { PyErr_SetString(PyExc_OverflowError, "string is too long"); return NULL; -- cgit v0.12