diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2014-09-11 07:58:02 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2014-09-11 07:58:02 (GMT) |
commit | d5fd6188e286a52334e24ef1ce4467618c2c1271 (patch) | |
tree | 525e720f81bcf93c6c8116f03b22ea585e913a08 | |
parent | 979f80b8da091c596f5e602accfb91962a816056 (diff) | |
parent | abf68ce16474a2d252723099f1c7a6d640191123 (diff) | |
download | cpython-d5fd6188e286a52334e24ef1ce4467618c2c1271.zip cpython-d5fd6188e286a52334e24ef1ce4467618c2c1271.tar.gz cpython-d5fd6188e286a52334e24ef1ce4467618c2c1271.tar.bz2 |
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.
-rw-r--r-- | Lib/test/test_tcl.py | 3 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_tkinter.c | 4 |
3 files changed, 9 insertions, 1 deletions
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 03b2c10..d0251aa 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -418,7 +418,6 @@ class TclTest(unittest.TestCase): self.assertEqual(passValue(['a', ['b', 'c']]), ('a', ('b', 'c')) if self.wantobjects else 'a {b c}') - @unittest.skipIf(sys.platform.startswith("aix"), 'Issue #21951: crashes on AIX') def test_user_command(self): result = None def testfunc(arg): @@ -446,9 +445,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') @@ -132,6 +132,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 a8e6d98..02fcb81 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -906,6 +906,8 @@ AsObj(PyObject *value) Py_ssize_t size, i; size = PySequence_Fast_GET_SIZE(value); + if (size == 0) + return Tcl_NewListObj(0, NULL); if (!CHECK_SIZE(size, sizeof(Tcl_Obj *))) { PyErr_SetString(PyExc_OverflowError, PyTuple_Check(value) ? "tuple is too long" : @@ -936,6 +938,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; |