55 lines
1.6 KiB
Diff
55 lines
1.6 KiB
Diff
From 098b139816f379271b8d4de2561b5805dd47d229 Mon Sep 17 00:00:00 2001
|
|
From: stratakis <cstratak@redhat.com>
|
|
Date: Wed, 6 Mar 2019 15:14:06 +0100
|
|
Subject: [PATCH 354/362] bpo-36147: Fix a memory leak in ctypes s_get()
|
|
(GH-12102)
|
|
|
|
The s_get() function leaks the result variable on low memory.
|
|
Partially backport commit 19b52545df898ec911c44e29f75badb902924c0
|
|
to fix it.
|
|
---
|
|
Modules/_ctypes/cfield.c | 26 +++++++++-----------------
|
|
1 file changed, 9 insertions(+), 17 deletions(-)
|
|
|
|
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
|
|
index 46f041b..1b495fc 100644
|
|
--- a/Modules/_ctypes/cfield.c
|
|
+++ b/Modules/_ctypes/cfield.c
|
|
@@ -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 *
|
|
--
|
|
1.8.3.1
|
|
|