diff options
author | Oren Milman <orenmn@gmail.com> | 2017-09-25 08:09:11 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2017-09-25 08:09:11 (GMT) |
commit | 57c2561c8c5663aef55b00e3f29cba575ff36ccd (patch) | |
tree | 36217c977dffe90a97c1e8043dac073865010bfc /Modules | |
parent | 0d4497b9cae7942b7f731a6f99a73985c3fb4630 (diff) | |
download | cpython-57c2561c8c5663aef55b00e3f29cba575ff36ccd.zip cpython-57c2561c8c5663aef55b00e3f29cba575ff36ccd.tar.gz cpython-57c2561c8c5663aef55b00e3f29cba575ff36ccd.tar.bz2 |
bpo-31311: Fix a SystemError and a crash in ctypes._CData.__setstate__(), in case of a bad __dict__. (#3254)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 8afb8cc..eaaedfa 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2674,6 +2674,16 @@ PyCData_setstate(PyObject *myself, PyObject *args) len = self->b_size; memmove(self->b_ptr, data, len); mydict = PyObject_GetAttrString(myself, "__dict__"); + if (mydict == NULL) { + return NULL; + } + if (!PyDict_Check(mydict)) { + PyErr_Format(PyExc_TypeError, + "%.200s.__dict__ must be a dictionary, not %.200s", + Py_TYPE(myself)->tp_name, Py_TYPE(mydict)->tp_name); + Py_DECREF(mydict); + return NULL; + } res = PyDict_Update(mydict, dict); Py_DECREF(mydict); if (res == -1) |