Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3a08db8

Browse files
gh-106307: Fix PyMapping_GetOptionalItemString() (GH-108797)
The resulting pointer was not set to NULL if the creation of a temporary string object was failed. The tests were also missed due to oversight.
1 parent bf414b7 commit 3a08db8

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

Lib/test/test_capi/test_abstract.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,43 @@ def test_mapping_getitemstring(self):
265265
self.assertRaises(TypeError, getitemstring, [], b'a')
266266
self.assertRaises(SystemError, getitemstring, NULL, b'a')
267267

268+
def test_mapping_getoptionalitem(self):
269+
getitem = _testcapi.mapping_getoptionalitem
270+
dct = {'a': 1, '\U0001f40d': 2}
271+
self.assertEqual(getitem(dct, 'a'), 1)
272+
self.assertEqual(getitem(dct, 'b'), KeyError)
273+
self.assertEqual(getitem(dct, '\U0001f40d'), 2)
274+
275+
dct2 = ProxyGetItem(dct)
276+
self.assertEqual(getitem(dct2, 'a'), 1)
277+
self.assertEqual(getitem(dct2, 'b'), KeyError)
278+
279+
self.assertEqual(getitem(['a', 'b', 'c'], 1), 'b')
280+
281+
self.assertRaises(TypeError, getitem, 42, 'a')
282+
self.assertRaises(TypeError, getitem, {}, []) # unhashable
283+
self.assertRaises(IndexError, getitem, [], 1)
284+
self.assertRaises(TypeError, getitem, [], 'a')
285+
# CRASHES getitem({}, NULL)
286+
# CRASHES getitem(NULL, 'a')
287+
288+
def test_mapping_getoptionalitemstring(self):
289+
getitemstring = _testcapi.mapping_getoptionalitemstring
290+
dct = {'a': 1, '\U0001f40d': 2}
291+
self.assertEqual(getitemstring(dct, b'a'), 1)
292+
self.assertEqual(getitemstring(dct, b'b'), KeyError)
293+
self.assertEqual(getitemstring(dct, '\U0001f40d'.encode()), 2)
294+
295+
dct2 = ProxyGetItem(dct)
296+
self.assertEqual(getitemstring(dct2, b'a'), 1)
297+
self.assertEqual(getitemstring(dct2, b'b'), KeyError)
298+
299+
self.assertRaises(TypeError, getitemstring, 42, b'a')
300+
self.assertRaises(UnicodeDecodeError, getitemstring, {}, b'\xff')
301+
self.assertRaises(SystemError, getitemstring, {}, NULL)
302+
self.assertRaises(TypeError, getitemstring, [], b'a')
303+
# CRASHES getitemstring(NULL, b'a')
304+
268305
def test_mapping_haskey(self):
269306
haskey = _testcapi.mapping_haskey
270307
dct = {'a': 1, '\U0001f40d': 2}

Objects/abstract.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2393,11 +2393,13 @@ int
23932393
PyMapping_GetOptionalItemString(PyObject *obj, const char *key, PyObject **result)
23942394
{
23952395
if (key == NULL) {
2396+
*result = NULL;
23962397
null_error();
23972398
return -1;
23982399
}
23992400
PyObject *okey = PyUnicode_FromString(key);
24002401
if (okey == NULL) {
2402+
*result = NULL;
24012403
return -1;
24022404
}
24032405
int rc = PyMapping_GetOptionalItem(obj, okey, result);

0 commit comments

Comments
 (0)