Commit 17c01785 authored by Serhiy Storchaka's avatar Serhiy Storchaka

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.
parent 1c09c0ea
...@@ -429,7 +429,6 @@ class TclTest(unittest.TestCase): ...@@ -429,7 +429,6 @@ class TclTest(unittest.TestCase):
self.assertEqual(passValue((1, '2', (3.4,))), self.assertEqual(passValue((1, '2', (3.4,))),
(1, '2', (3.4,)) if self.wantobjects else '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): def test_user_command(self):
result = [] result = []
def testfunc(arg): def testfunc(arg):
...@@ -456,9 +455,11 @@ class TclTest(unittest.TestCase): ...@@ -456,9 +455,11 @@ class TclTest(unittest.TestCase):
check('string') check('string')
check('string\xbd') check('string\xbd')
check('string\xe2\x82\xac', u'string\u20ac') check('string\xe2\x82\xac', u'string\u20ac')
check('')
check(u'string') check(u'string')
check(u'string\xbd') check(u'string\xbd')
check(u'string\u20ac') check(u'string\u20ac')
check(u'')
check('str\xc0\x80ing', u'str\x00ing') check('str\xc0\x80ing', u'str\x00ing')
check('str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac') check('str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
check(u'str\x00ing') check(u'str\x00ing')
......
...@@ -22,6 +22,9 @@ Core and Builtins ...@@ -22,6 +22,9 @@ Core and Builtins
Library 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 - Issue #21951: Tkinter now most likely raises MemoryError instead of crash
if the memory allocation fails. if the memory allocation fails.
......
...@@ -1052,6 +1052,8 @@ AsObj(PyObject *value) ...@@ -1052,6 +1052,8 @@ AsObj(PyObject *value)
Py_ssize_t size, i; Py_ssize_t size, i;
size = PyTuple_Size(value); size = PyTuple_Size(value);
if (size == 0)
return Tcl_NewListObj(0, NULL);
if (!CHECK_SIZE(size, sizeof(Tcl_Obj *))) { if (!CHECK_SIZE(size, sizeof(Tcl_Obj *))) {
PyErr_SetString(PyExc_OverflowError, "tuple is too long"); PyErr_SetString(PyExc_OverflowError, "tuple is too long");
return NULL; return NULL;
...@@ -1075,6 +1077,8 @@ AsObj(PyObject *value) ...@@ -1075,6 +1077,8 @@ AsObj(PyObject *value)
Tcl_UniChar *outbuf = NULL; Tcl_UniChar *outbuf = NULL;
Py_ssize_t i; Py_ssize_t i;
size_t allocsize; size_t allocsize;
if (size == 0)
return Tcl_NewUnicodeObj((const void *)"", 0);
if (!CHECK_SIZE(size, sizeof(Tcl_UniChar))) { if (!CHECK_SIZE(size, sizeof(Tcl_UniChar))) {
PyErr_SetString(PyExc_OverflowError, "string is too long"); PyErr_SetString(PyExc_OverflowError, "string is too long");
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment