summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-09-27 12:24:13 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-09-27 12:24:13 (GMT)
commit36beb5ec135142b1e800577be49238bf767f4a79 (patch)
tree272ed24798eee9d58dabe9090f49c60c01f2915f
parentaa0342091f29526fec87d35ae5c5300f968d1b57 (diff)
downloadcpython-36beb5ec135142b1e800577be49238bf767f4a79.zip
cpython-36beb5ec135142b1e800577be49238bf767f4a79.tar.gz
cpython-36beb5ec135142b1e800577be49238bf767f4a79.tar.bz2
Issue #27963: Fixed possible null pointer dereference in ctypes.set_conversion_mode().
Patch by Xiang Zhang.
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_ctypes/callproc.c37
2 files changed, 31 insertions, 9 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index c1d111c..4399985 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -42,6 +42,9 @@ Core and Builtins
Library
-------
+- Issue #27963: Fixed possible null pointer dereference in
+ ctypes.set_conversion_mode(). Patch by Xiang Zhang.
+
- Issue #28284: Strengthen resistance of ``_json.encode_basestring_ascii()`` to
integer overflow.
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 419beb1..3a12eb6 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1688,22 +1688,41 @@ between unicode and strings. Returns the previous values.\n";
static PyObject *
set_conversion_mode(PyObject *self, PyObject *args)
{
- char *coding, *mode;
+ char *coding, *mode, *errors, *encoding=NULL;
PyObject *result;
if (!PyArg_ParseTuple(args, "zs:set_conversion_mode", &coding, &mode))
return NULL;
- result = Py_BuildValue("(zz)", _ctypes_conversion_encoding, _ctypes_conversion_errors);
+
+ result = Py_BuildValue("(zz)", _ctypes_conversion_encoding,
+ _ctypes_conversion_errors);
+ if (!result) {
+ return NULL;
+ }
+
if (coding) {
- PyMem_Free(_ctypes_conversion_encoding);
- _ctypes_conversion_encoding = PyMem_Malloc(strlen(coding) + 1);
- strcpy(_ctypes_conversion_encoding, coding);
- } else {
- _ctypes_conversion_encoding = NULL;
+ encoding = PyMem_Malloc(strlen(coding) + 1);
+ if (!encoding) {
+ Py_DECREF(result);
+ return PyErr_NoMemory();
+ }
+ strcpy(encoding, coding);
+ }
+
+ errors = PyMem_Malloc(strlen(mode) + 1);
+ if (!errors) {
+ Py_DECREF(result);
+ PyMem_Free(encoding);
+ return PyErr_NoMemory();
}
+ strcpy(errors, mode);
+
+ PyMem_Free(_ctypes_conversion_encoding);
+ _ctypes_conversion_encoding = encoding;
+
PyMem_Free(_ctypes_conversion_errors);
- _ctypes_conversion_errors = PyMem_Malloc(strlen(mode) + 1);
- strcpy(_ctypes_conversion_errors, mode);
+ _ctypes_conversion_errors = errors;
+
return result;
}
#endif