diff -r de9e410e78d8 Modules/_ctypes/callproc.c --- a/Modules/_ctypes/callproc.c Mon Sep 05 00:01:28 2016 -0400 +++ b/Modules/_ctypes/callproc.c Tue Sep 06 13:48:23 2016 +0800 @@ -1688,22 +1688,41 @@ 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