]> granicus.if.org Git - python/commitdiff
Issue #27963: Fixed possible null pointer dereference in ctypes.set_conversion_mode().
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 27 Sep 2016 12:24:13 +0000 (15:24 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 27 Sep 2016 12:24:13 +0000 (15:24 +0300)
Patch by Xiang Zhang.

Misc/NEWS
Modules/_ctypes/callproc.c

index c1d111ca712b570ecd2f445feb7e960b700a536d..43999858c98b7a767c51b12fcae9aa7113c5ef07 100644 (file)
--- 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.
 
index 419beb188b78c6ec2f8e75422702c823651897a8..3a12eb603e5e8b3744bb5a82bf29a16cee7dbcab 100644 (file)
@@ -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