bpo-36147: Fix a memory leak in ctypes s_get() (GH-12102) · python/cpython@098b139 (original) (raw)

Original file line number Diff line number Diff line change
@@ -1291,24 +1291,16 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
1291 1291 static PyObject *
1292 1292 s_get(void *ptr, Py_ssize_t size)
1293 1293 {
1294 -PyObject *result;
1295 -size_t slen;
1294 +Py_ssize_t i;
1295 +char *p;
1296 1296
1297 -result = PyString_FromString((char *)ptr);
1298 -if (!result)
1299 -return NULL;
1300 -/* chop off at the first NUL character, if any.
1301 - * On error, result will be deallocated and set to NULL.
1302 - */
1303 -slen = strlen(PyString_AS_STRING(result));
1304 -size = min(size, (Py_ssize_t)slen);
1305 -if (result->ob_refcnt == 1) {
1306 -/* shorten the result */
1307 -_PyString_Resize(&result, size);
1308 -return result;
1309 - } else
1310 -/* cannot shorten the result */
1311 -return PyString_FromStringAndSize(ptr, size);
1297 +p = (char *)ptr;
1298 +for (i = 0; i < size; ++i) {
1299 +if (*p++ == '\0')
1300 +break;
1301 + }
1302 +
1303 +return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
1312 1304 }
1313 1305
1314 1306 static PyObject *