empty string or tuple argument.
On some platforms Tcl memory allocator returns NULL when allocating zero-sized
block of memory.
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):
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')
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.
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;
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;