summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorOren Milman <orenmn@gmail.com>2017-09-25 08:09:11 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2017-09-25 08:09:11 (GMT)
commit57c2561c8c5663aef55b00e3f29cba575ff36ccd (patch)
tree36217c977dffe90a97c1e8043dac073865010bfc /Modules
parent0d4497b9cae7942b7f731a6f99a73985c3fb4630 (diff)
downloadcpython-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.c10
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)