gh-84489: Properly handle trailing spaces in Py_BuildValue() format strings (GH-21158)

The docs state that the space, tab, colon, and comma characters are
ignored in Py_BuildValue() format strings.

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Zackery Spytz 2023-10-11 04:44:06 -07:00 committed by GitHub
parent f27b830907
commit f83fa0b9eb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 35 deletions

View file

@ -319,6 +319,7 @@ class CAPITest(unittest.TestCase):
self.assertEqual(buildvalue('((OO))', 1, 2), ((1, 2),))
self.assertEqual(buildvalue(' \t,:'), None)
self.assertEqual(buildvalue('O,', 1), 1)
self.assertEqual(buildvalue(' O ', 1), 1)
self.assertEqual(buildvalue('\tO\t', 1), 1)
self.assertEqual(buildvalue('O,O', 1, 2), (1, 2))
@ -327,17 +328,18 @@ class CAPITest(unittest.TestCase):
self.assertEqual(buildvalue('O O', 1, 2), (1, 2))
self.assertEqual(buildvalue('O\tO', 1, 2), (1, 2))
self.assertEqual(buildvalue('(O,O)', 1, 2), (1, 2))
self.assertEqual(buildvalue('(O, O)', 1, 2), (1, 2))
self.assertEqual(buildvalue(' ( O O) ', 1, 2), (1, 2))
self.assertEqual(buildvalue('\t(\tO\tO)\t', 1, 2), (1, 2))
self.assertEqual(buildvalue('(O, O,)', 1, 2), (1, 2))
self.assertEqual(buildvalue(' ( O O ) ', 1, 2), (1, 2))
self.assertEqual(buildvalue('\t(\tO\tO\t)\t', 1, 2), (1, 2))
self.assertEqual(buildvalue('[O,O]', 1, 2), [1, 2])
self.assertEqual(buildvalue('[O, O]', 1, 2), [1, 2])
self.assertEqual(buildvalue(' [ O O] ', 1, 2), [1, 2])
self.assertEqual(buildvalue('[O, O,]', 1, 2), [1, 2])
self.assertEqual(buildvalue(' [ O O ] ', 1, 2), [1, 2])
self.assertEqual(buildvalue(' [\tO\tO\t] ', 1, 2), [1, 2])
self.assertEqual(buildvalue('{O:O}', 1, 2), {1: 2})
self.assertEqual(buildvalue('{O:O,O:O}', 1, 2, 3, 4), {1: 2, 3: 4})
self.assertEqual(buildvalue('{O: O, O: O}', 1, 2, 3, 4), {1: 2, 3: 4})
self.assertEqual(buildvalue(' { O O O O} ', 1, 2, 3, 4), {1: 2, 3: 4})
self.assertEqual(buildvalue('\t{\tO\tO\tO\tO}\t', 1, 2, 3, 4), {1: 2, 3: 4})
self.assertEqual(buildvalue('{O: O, O: O,}', 1, 2, 3, 4), {1: 2, 3: 4})
self.assertEqual(buildvalue(' { O O O O } ', 1, 2, 3, 4), {1: 2, 3: 4})
self.assertEqual(buildvalue('\t{\tO\tO\tO\tO\t}\t', 1, 2, 3, 4), {1: 2, 3: 4})
self.assertRaises(SystemError, buildvalue, 'O', NULL)
self.assertRaises(SystemError, buildvalue, '(O)', NULL)
@ -378,6 +380,12 @@ class CAPITest(unittest.TestCase):
self.assertEqual(buildvalue('C', sys.maxunicode), chr(sys.maxunicode))
self.assertRaises(ValueError, buildvalue, 'C', -1)
self.assertRaises(ValueError, buildvalue, 'C', sys.maxunicode+1)
# gh-84489
self.assertRaises(ValueError, buildvalue, '(C )i', -1, 2)
self.assertRaises(ValueError, buildvalue, '[C ]i', -1, 2)
self.assertRaises(ValueError, buildvalue, '{Ci }i', -1, 2, 3)
def test_buildvalue_N(self):
_testcapi.test_buildvalue_N()