Skip to content

Commit d26686a

Browse files
GH-140590: Fix setstate for functools.partial C-module (GH-140671)
Co-authored-by: Mikhail Efimov <[email protected]>
1 parent f4e6370 commit d26686a

File tree

3 files changed

+7
-1
lines changed

3 files changed

+7
-1
lines changed

Lib/test/test_functools.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,13 +406,16 @@ def test_setstate(self):
406406

407407
def test_setstate_errors(self):
408408
f = self.partial(signature)
409+
409410
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}))
410411
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, {}, None))
411412
self.assertRaises(TypeError, f.__setstate__, [capture, (), {}, None])
412413
self.assertRaises(TypeError, f.__setstate__, (None, (), {}, None))
413414
self.assertRaises(TypeError, f.__setstate__, (capture, None, {}, None))
414415
self.assertRaises(TypeError, f.__setstate__, (capture, [], {}, None))
415416
self.assertRaises(TypeError, f.__setstate__, (capture, (), [], None))
417+
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, ()))
418+
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, 'test'))
416419

417420
def test_setstate_subclasses(self):
418421
f = self.partial(signature)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix arguments checking for the :meth:`!functools.partial.__setstate__` that
2+
may lead to internal state corruption and crash. Patch by Sergey Miryanov.

Modules/_functoolsmodule.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,8 @@ partial_setstate(PyObject *self, PyObject *state)
778778
if (!PyArg_ParseTuple(state, "OOOO", &fn, &fnargs, &kw, &dict) ||
779779
!PyCallable_Check(fn) ||
780780
!PyTuple_Check(fnargs) ||
781-
(kw != Py_None && !PyDict_Check(kw)))
781+
(kw != Py_None && !PyDict_Check(kw)) ||
782+
(dict != Py_None && !PyDict_Check(dict)))
782783
{
783784
PyErr_SetString(PyExc_TypeError, "invalid partial state");
784785
return NULL;

0 commit comments

Comments
 (0)