Skip to content

Commit bec053c

Browse files
miss-islingtonsergey-miryanovefimov-mikhail
authored
[3.13] GH-140590: Fix setstate for functools.partial C-module (GH-140671) (#140699)
GH-140590: Fix setstate for functools.partial C-module (GH-140671) (cherry picked from commit d26686a) Co-authored-by: Sergey Miryanov <[email protected]> Co-authored-by: Mikhail Efimov <[email protected]>
1 parent 9c8eade commit bec053c

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
@@ -313,13 +313,16 @@ def test_setstate(self):
313313

314314
def test_setstate_errors(self):
315315
f = self.partial(signature)
316+
316317
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}))
317318
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, {}, None))
318319
self.assertRaises(TypeError, f.__setstate__, [capture, (), {}, None])
319320
self.assertRaises(TypeError, f.__setstate__, (None, (), {}, None))
320321
self.assertRaises(TypeError, f.__setstate__, (capture, None, {}, None))
321322
self.assertRaises(TypeError, f.__setstate__, (capture, [], {}, None))
322323
self.assertRaises(TypeError, f.__setstate__, (capture, (), [], None))
324+
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, ()))
325+
self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, 'test'))
323326

324327
def test_setstate_subclasses(self):
325328
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
@@ -471,7 +471,8 @@ partial_setstate(partialobject *pto, PyObject *state)
471471
!PyArg_ParseTuple(state, "OOOO", &fn, &fnargs, &kw, &dict) ||
472472
!PyCallable_Check(fn) ||
473473
!PyTuple_Check(fnargs) ||
474-
(kw != Py_None && !PyDict_Check(kw)))
474+
(kw != Py_None && !PyDict_Check(kw)) ||
475+
(dict != Py_None && !PyDict_Check(dict)))
475476
{
476477
PyErr_SetString(PyExc_TypeError, "invalid partial state");
477478
return NULL;

0 commit comments

Comments
 (0)