python plugin: Fix memory leak.
authorFlorian Forster <octo@collectd.org>
Tue, 8 Dec 2015 12:41:35 +0000 (13:41 +0100)
committerFlorian Forster <octo@collectd.org>
Tue, 8 Dec 2015 12:41:35 +0000 (13:41 +0100)
The regiser_read / register_write functions assume a user_data_t*
pointing to static memory and will not store / free the pointer.

CID: 38002

src/python.c

index 95240af..6a65ff2 100644 (file)
@@ -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);
 }