X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdtool.c;h=4a3c345ef3ae34f198f8ce89f5b4806e2fe51b95;hb=749b03b3fc459895b7415c7c13753066bf0af55b;hp=c795e2656502685ca353937ddda2b9defcd3a518;hpb=1894607dc4c03ce20db7c5256c97890aa70bcaa5;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index c795e265..4a3c345e 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -204,7 +204,7 @@ static int value_list_to_string_multiple (char *buffer, int buffer_len, int offset; int status; time_t tt; - int i; + size_t i; memset (buffer, '\0', buffer_len); @@ -227,7 +227,7 @@ static int value_list_to_string_multiple (char *buffer, int buffer_len, ":%llu", vl->values[i].counter); else if (ds->ds[i].type == DS_TYPE_GAUGE) status = ssnprintf (buffer + offset, buffer_len - offset, - ":%lf", vl->values[i].gauge); + ":"GAUGE_FORMAT, vl->values[i].gauge); else if (ds->ds[i].type == DS_TYPE_DERIVE) status = ssnprintf (buffer + offset, buffer_len - offset, ":%"PRIi64, vl->values[i].derive); @@ -262,7 +262,7 @@ static int value_list_to_string (char *buffer, int buffer_len, (unsigned) tt, vl->values[0].derive); break; case DS_TYPE_GAUGE: - status = ssnprintf (buffer, buffer_len, "%u:%lf", + status = ssnprintf (buffer, buffer_len, "%u:"GAUGE_FORMAT, (unsigned) tt, vl->values[0].gauge); break; case DS_TYPE_COUNTER: @@ -733,7 +733,10 @@ static int rrd_cache_insert (const char *filename, { rc = malloc (sizeof (*rc)); if (rc == NULL) + { + pthread_mutex_unlock (&cache_lock); return (-1); + } rc->values_num = 0; rc->values = NULL; rc->first_value = 0; @@ -743,6 +746,7 @@ static int rrd_cache_insert (const char *filename, new_rc = 1; } + assert (value_time > 0); /* plugin_dispatch() ensures this. */ if (rc->last_value >= value_time) { pthread_mutex_unlock (&cache_lock); @@ -1004,23 +1008,32 @@ static int rrd_config (const char *key, const char *value) } else if (strcasecmp ("DataDir", key) == 0) { - if (datadir != NULL) - free (datadir); - datadir = strdup (value); - if (datadir != NULL) + char *tmp; + size_t len; + + tmp = strdup (value); + if (tmp == NULL) { - int len = strlen (datadir); - while ((len > 0) && (datadir[len - 1] == '/')) - { - len--; - datadir[len] = '\0'; - } - if (len <= 0) - { - free (datadir); - datadir = NULL; - } + ERROR ("rrdtool plugin: strdup failed."); + return (1); } + + len = strlen (datadir); + while ((len > 0) && (datadir[len - 1] == '/')) + { + len--; + datadir[len] = 0; + } + + if (len == 0) + { + ERROR ("rrdtool plugin: Invalid \"DataDir\" option."); + sfree (tmp); + return (1); + } + + sfree (datadir); + datadir = tmp; } else if (strcasecmp ("StepSize", key) == 0) { @@ -1203,6 +1216,7 @@ static int rrd_init (void) cache = c_avl_create ((int (*) (const void *, const void *)) strcmp); if (cache == NULL) { + pthread_mutex_unlock (&cache_lock); ERROR ("rrdtool plugin: c_avl_create failed."); return (-1); }