Fix memory leak in _handle_string_or_none_result
All checks were successful
CI / Check spelling (pull_request) Successful in 4m23s
CI / Check coding style (pull_request) Successful in 10m37s
CI / Linux (fedora) (pull_request) Successful in 11m27s
CI / Linux (debian) (pull_request) Successful in 12m48s
CI / Linux (arch) (pull_request) Successful in 16m54s
CI / Linux (ubuntu) (pull_request) Successful in 48m55s
All checks were successful
CI / Check spelling (pull_request) Successful in 4m23s
CI / Check coding style (pull_request) Successful in 10m37s
CI / Linux (fedora) (pull_request) Successful in 11m27s
CI / Linux (debian) (pull_request) Successful in 12m48s
CI / Linux (arch) (pull_request) Successful in 16m54s
CI / Linux (ubuntu) (pull_request) Successful in 48m55s
The function did not decref the Python object on type error paths, resulting in a reference count leak. This caused memory to accumulate over time. Added Py_XDECREF on all early return paths to properly free the Python object reference and prevent leaks.
This commit is contained in:
@@ -900,6 +900,8 @@ _python_type_error(ProfPlugin* plugin, char* hook, char* type)
|
|||||||
g_string_free(err_msg, TRUE);
|
g_string_free(err_msg, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts a Python string or None result to a C string and decreases the Python object's reference count.
|
||||||
|
// If the result is NULL, or not a string/unicode/bytes/None, logs an error and returns NULL.
|
||||||
static char*
|
static char*
|
||||||
_handle_string_or_none_result(ProfPlugin* plugin, PyObject* result, char* hook)
|
_handle_string_or_none_result(ProfPlugin* plugin, PyObject* result, char* hook)
|
||||||
{
|
{
|
||||||
@@ -910,18 +912,16 @@ _handle_string_or_none_result(ProfPlugin* plugin, PyObject* result, char* hook)
|
|||||||
}
|
}
|
||||||
#ifdef PY_IS_PYTHON3
|
#ifdef PY_IS_PYTHON3
|
||||||
if (result != Py_None && !PyUnicode_Check(result) && !PyBytes_Check(result)) {
|
if (result != Py_None && !PyUnicode_Check(result) && !PyBytes_Check(result)) {
|
||||||
allow_python_threads();
|
|
||||||
_python_type_error(plugin, hook, "string, unicode or None");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
if (result != Py_None && !PyUnicode_Check(result) && !PyString_Check(result)) {
|
if (result != Py_None && !PyUnicode_Check(result) && !PyString_Check(result)) {
|
||||||
|
#endif
|
||||||
|
Py_XDECREF(result);
|
||||||
allow_python_threads();
|
allow_python_threads();
|
||||||
_python_type_error(plugin, hook, "string, unicode or None");
|
_python_type_error(plugin, hook, "string, unicode or None");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
char* result_str = python_str_or_unicode_to_string(result);
|
char* result_str = python_str_or_unicode_to_string(result);
|
||||||
|
Py_XDECREF(result);
|
||||||
allow_python_threads();
|
allow_python_threads();
|
||||||
return result_str;
|
return result_str;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user