Issue #21552: Fixed possible integer overflow of too long string lengths in
the Tkinter module on 64-bit platforms.
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
index 7062e7e..91fb28f 100644
--- a/Lib/test/test_tcl.py
+++ b/Lib/test/test_tcl.py
@@ -569,6 +569,7 @@
         for arg, res in testcases:
             self.assertEqual(split(arg), res)
 
+character_size = 4 if sys.maxunicode > 0xFFFF else 2
 
 class BigmemTclTest(unittest.TestCase):
 
@@ -578,10 +579,59 @@
     @test_support.cpython_only
     @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
     @test_support.precisionbigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
-    def test_huge_string(self, size):
+    def test_huge_string_call(self, size):
         value = ' ' * size
         self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
 
+    @test_support.cpython_only
+    @unittest.skipUnless(test_support.have_unicode, 'requires unicode support')
+    @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
+    @test_support.precisionbigmemtest(size=INT_MAX + 1,
+                                      memuse=2*character_size + 2,
+                                      dry_run=False)
+    def test_huge_unicode_call(self, size):
+        value = unicode(' ') * size
+        self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
+
+
+    @test_support.cpython_only
+    @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
+    @test_support.precisionbigmemtest(size=INT_MAX + 1, memuse=9, dry_run=False)
+    def test_huge_string_builtins(self, size):
+        value = '1' + ' ' * size
+        self.check_huge_string_builtins(value)
+
+    @test_support.cpython_only
+    @unittest.skipUnless(test_support.have_unicode, 'requires unicode support')
+    @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
+    @test_support.precisionbigmemtest(size=INT_MAX + 1,
+                                      memuse=2*character_size + 7,
+                                      dry_run=False)
+    def test_huge_unicode_builtins(self, size):
+        value = unicode('1' + ' ' * size)
+        self.check_huge_string_builtins(value)
+
+    def check_huge_string_builtins(self, value):
+        self.assertRaises(OverflowError, self.interp.tk.getint, value)
+        self.assertRaises(OverflowError, self.interp.tk.getdouble, value)
+        self.assertRaises(OverflowError, self.interp.tk.getboolean, value)
+        self.assertRaises(OverflowError, self.interp.eval, value)
+        self.assertRaises(OverflowError, self.interp.evalfile, value)
+        self.assertRaises(OverflowError, self.interp.record, value)
+        self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
+        self.assertRaises(OverflowError, self.interp.setvar, value, 'x', 'a')
+        self.assertRaises(OverflowError, self.interp.setvar, 'x', value, 'a')
+        self.assertRaises(OverflowError, self.interp.unsetvar, value)
+        self.assertRaises(OverflowError, self.interp.unsetvar, 'x', value)
+        self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
+        self.assertRaises(OverflowError, self.interp.exprstring, value)
+        self.assertRaises(OverflowError, self.interp.exprlong, value)
+        self.assertRaises(OverflowError, self.interp.exprboolean, value)
+        self.assertRaises(OverflowError, self.interp.splitlist, value)
+        self.assertRaises(OverflowError, self.interp.split, value)
+        self.assertRaises(OverflowError, self.interp.createcommand, value, max)
+        self.assertRaises(OverflowError, self.interp.deletecommand, value)
+
 
 def setUpModule():
     if test_support.verbose: