X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils_cache.c;h=fa6e6603ec3e10eedcdc6ea7d56ab64a0b04db6e;hb=a02ced789b4c93f293dc9d14a5a303c5fe11bcce;hp=dd5bcb59ffc9833b2a92341a085e32d526e9e812;hpb=efa4700ad47969749b0fca622294fd006b2d7cb8;p=collectd.git diff --git a/src/utils_cache.c b/src/utils_cache.c index dd5bcb59..fa6e6603 100644 --- a/src/utils_cache.c +++ b/src/utils_cache.c @@ -572,6 +572,7 @@ int uc_get_names (char ***ret_names, cdtime_t **ret_times, size_t *ret_number) char **names = NULL; cdtime_t *times = NULL; size_t number = 0; + size_t size_arrays = 0; int status = 0; @@ -580,42 +581,47 @@ int uc_get_names (char ***ret_names, cdtime_t **ret_times, size_t *ret_number) pthread_mutex_lock (&cache_lock); + size_arrays = (size_t) c_avl_size (cache_tree); + if (size_arrays < 1) + { + /* Handle the "no values" case here, to avoid the error message when + * calloc() returns NULL. */ + pthread_mutex_unlock (&cache_lock); + return (0); + } + + names = calloc (size_arrays, sizeof (*names)); + times = calloc (size_arrays, sizeof (*times)); + if ((names == NULL) || (times == NULL)) + { + ERROR ("uc_get_names: calloc failed."); + sfree (names); + sfree (times); + pthread_mutex_unlock (&cache_lock); + return (ENOMEM); + } + iter = c_avl_get_iterator (cache_tree); while (c_avl_iterator_next (iter, (void *) &key, (void *) &value) == 0) { - char **temp; - /* remove missing values when list values */ if (value->state == STATE_MISSING) continue; - if (ret_times != NULL) - { - cdtime_t *tmp_times; + /* c_avl_size does not return a number smaller than the number of elements + * returned by c_avl_iterator_next. */ + assert (number < size_arrays); - tmp_times = (cdtime_t *) realloc (times, sizeof (cdtime_t) * (number + 1)); - if (tmp_times == NULL) - { - status = -1; - break; - } - times = tmp_times; + if (ret_times != NULL) times[number] = value->last_time; - } - temp = (char **) realloc (names, sizeof (char *) * (number + 1)); - if (temp == NULL) - { - status = -1; - break; - } - names = temp; names[number] = strdup (key); if (names[number] == NULL) { status = -1; break; } + number++; } /* while (c_avl_iterator_next) */