]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-36147: Fix a memory leak in ctypes s_get() (GH-12102)
authorstratakis <cstratak@redhat.com>
Wed, 6 Mar 2019 14:14:06 +0000 (15:14 +0100)
committerVictor Stinner <vstinner@redhat.com>
Wed, 6 Mar 2019 14:14:06 +0000 (15:14 +0100)
The s_get() function leaks the result variable on low memory.
Partially backport commit 19b52545df898ec911c44e29f75badb902924c0
to fix it.

Modules/_ctypes/cfield.c

index 46f041b00e39142d04b4c105d0bbc0b5ccb4dd21..1b495fc9ac539a1b8cbc81d111eacb09f2025aed 100644 (file)
@@ -1291,24 +1291,16 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
 static PyObject *
 s_get(void *ptr, Py_ssize_t size)
 {
-    PyObject *result;
-    size_t slen;
+    Py_ssize_t i;
+    char *p;
 
-    result = PyString_FromString((char *)ptr);
-    if (!result)
-        return NULL;
-    /* chop off at the first NUL character, if any.
-     * On error, result will be deallocated and set to NULL.
-     */
-    slen = strlen(PyString_AS_STRING(result));
-    size = min(size, (Py_ssize_t)slen);
-    if (result->ob_refcnt == 1) {
-        /* shorten the result */
-        _PyString_Resize(&result, size);
-        return result;
-    } else
-        /* cannot shorten the result */
-        return PyString_FromStringAndSize(ptr, size);
+    p = (char *)ptr;
+    for (i = 0; i < size; ++i) {
+        if (*p++ == '\0')
+            break;
+    }
+
+    return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
 }
 
 static PyObject *