From: Ben Knight Date: Tue, 1 Dec 2009 08:03:27 +0000 (+0100) Subject: src/utils_cmd_listval.c: Free memory returned by `uc_get_names'. X-Git-Tag: collectd-4.7.5~7 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=bc42a61b1f8e518c7decb824dc61e85d4e9f02b8;p=collectd.git src/utils_cmd_listval.c: Free memory returned by `uc_get_names'. We've run into a memory leak in collectd, triggered by usage of 'listval' via the unixsock plugin. When making a 'listval' call, utils_cmd_listval.c:handle_listval() calls utils_cache.c:uc_get_names() to retrieve a list of active value names from the internal cache. uc_get_names() uses realloc() to allocate memory in which to store the list, and returns pointers. handle_listval() does not perform a free() on the returned memory. Each time listval is called, some memory is leaked. handle_getval() does not suffer from the same problem - a free() is called in that case. --- diff --git a/src/utils_cmd_listval.c b/src/utils_cmd_listval.c index bca83a99..072593f9 100644 --- a/src/utils_cmd_listval.c +++ b/src/utils_cmd_listval.c @@ -79,8 +79,14 @@ int handle_listval (FILE *fh, char *buffer) print_to_socket (fh, "%i Value%s found\n", (int) number, (number == 1) ? "" : "s"); for (i = 0; i < number; i++) + { print_to_socket (fh, "%u %s\n", (unsigned int) times[i], names[i]); + sfree(names[i]); + } + sfree(names); + sfree(times); + return (0); } /* int handle_listval */