Issue #18339: Negative ints keys in unpickler.memo dict no longer cause a
segfault inside the _pickle C extension.
This commit is contained in:
parent
8a0b7756e2
commit
a24b4d260b
|
@ -115,6 +115,13 @@ if has_c_implementation:
|
|||
pickler_class = _pickle.Pickler
|
||||
unpickler_class = _pickle.Unpickler
|
||||
|
||||
def test_issue18339(self):
|
||||
unpickler = self.unpickler_class(io.BytesIO())
|
||||
self.assertRaises(TypeError, setattr, unpickler, "memo", object)
|
||||
# used to cause a segfault
|
||||
self.assertRaises(ValueError, setattr, unpickler, "memo", {-1: None})
|
||||
unpickler.memo = {1: None}
|
||||
|
||||
class CDispatchTableTests(AbstractDispatchTableTests):
|
||||
pickler_class = pickle.Pickler
|
||||
def get_dispatch_table(self):
|
||||
|
|
|
@ -38,6 +38,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #18339: Negative ints keys in unpickler.memo dict no longer cause a
|
||||
segfault inside the _pickle C extension.
|
||||
|
||||
- Issue #18224: Removed pydoc script from created venv, as it causes problems
|
||||
on Windows and adds no value over and above python -m pydoc ...
|
||||
|
||||
|
|
|
@ -5931,6 +5931,11 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
|
|||
idx = PyLong_AsSsize_t(key);
|
||||
if (idx == -1 && PyErr_Occurred())
|
||||
goto error;
|
||||
if (idx < 0) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"memos key must be positive integers.");
|
||||
goto error;
|
||||
}
|
||||
if (_Unpickler_MemoPut(self, idx, value) < 0)
|
||||
goto error;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue