From: Florian Forster Date: Tue, 8 Dec 2015 12:41:35 +0000 (+0100) Subject: python plugin: Fix memory leak. X-Git-Tag: collectd-5.5.1~13^2~10 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=3e413a72f2387d600fa00169823c7ce0d0b649b5;p=collectd.git python plugin: Fix memory leak. The regiser_read / register_write functions assume a user_data_t* pointing to static memory and will not store / free the pointer. CID: 38002 --- diff --git a/src/python.c b/src/python.c index 95240afb..6a65ff25 100644 --- a/src/python.c +++ b/src/python.c @@ -573,7 +573,7 @@ static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObjec char buf[512]; reg_function_t *register_function = (reg_function_t *) reg; cpy_callback_t *c = NULL; - user_data_t *user_data = NULL; + user_data_t user_data; char *name = NULL; PyObject *callback = NULL, *data = NULL; static char *kwlist[] = {"callback", "data", "name", NULL}; @@ -594,17 +594,19 @@ static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObjec c->callback = callback; c->data = data; c->next = NULL; - user_data = malloc(sizeof(*user_data)); - user_data->free_func = cpy_destroy_user_data; - user_data->data = c; - register_function(buf, handler, user_data); + + memset (&user_data, 0, sizeof (user_data)); + user_data.free_func = cpy_destroy_user_data; + user_data.data = c; + + register_function(buf, handler, &user_data); return cpy_string_to_unicode_or_bytes(buf); } static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwds) { char buf[512]; cpy_callback_t *c = NULL; - user_data_t *user_data = NULL; + user_data_t user_data; double interval = 0; char *name = NULL; PyObject *callback = NULL, *data = NULL; @@ -627,13 +629,16 @@ static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwd c->callback = callback; c->data = data; c->next = NULL; - user_data = malloc(sizeof(*user_data)); - user_data->free_func = cpy_destroy_user_data; - user_data->data = c; + + memset (&user_data, 0, sizeof (user_data)); + user_data.free_func = cpy_destroy_user_data; + user_data.data = c; + ts.tv_sec = interval; ts.tv_nsec = (interval - ts.tv_sec) * 1000000000; - plugin_register_complex_read(/* group = */ NULL, buf, - cpy_read_callback, &ts, user_data); + plugin_register_complex_read(/* group = */ "python", buf, + cpy_read_callback, &ts, &user_data); + return cpy_string_to_unicode_or_bytes(buf); }