We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent f4e6370 commit d26686aCopy full SHA for d26686a
3 files changed
Lib/test/test_functools.py
@@ -406,13 +406,16 @@ def test_setstate(self):
406
407
def test_setstate_errors(self):
408
f = self.partial(signature)
409
+
410
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}))
411
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, {}, None))
412
self.assertRaises(TypeError, f.__setstate__, [capture, (), {}, None])
413
self.assertRaises(TypeError, f.__setstate__, (None, (), {}, None))
414
self.assertRaises(TypeError, f.__setstate__, (capture, None, {}, None))
415
self.assertRaises(TypeError, f.__setstate__, (capture, [], {}, None))
416
self.assertRaises(TypeError, f.__setstate__, (capture, (), [], None))
417
+ self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, ()))
418
+ self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, 'test'))
419
420
def test_setstate_subclasses(self):
421
Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst
@@ -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
@@ -778,7 +778,8 @@ partial_setstate(PyObject *self, PyObject *state)
778
if (!PyArg_ParseTuple(state, "OOOO", &fn, &fnargs, &kw, &dict) ||
779
!PyCallable_Check(fn) ||
780
!PyTuple_Check(fnargs) ||
781
- (kw != Py_None && !PyDict_Check(kw)))
+ (kw != Py_None && !PyDict_Check(kw)) ||
782
+ (dict != Py_None && !PyDict_Check(dict)))
783
{
784
PyErr_SetString(PyExc_TypeError, "invalid partial state");
785
return NULL;
0 commit comments