+2017-06-06, Version 5.7.2
+ * Build system: The Notify Email plugin is no longer linked with
+ indirect dependencies. Thanks to Marc Fournier.
+ * collectd: A race condition when calculating a metric's rate has been
+ fixed. Thanks to Florian Forster. #1193
+ * AMQP, Exec, UnixSock, Write Kafka plugins: Parsing of the PUTVAL
+ command with multiple values has been fixed. Thanks to Florian
+ Forster. #2274
+ * AMQP plugin: The "ExchangeType" option is now also valid for
+ publishers. Thanks to Florian Forster. #2286
+ * BIND plugin: Fix parsing of the sample time provided by BIND.
+ Previously, the time was assumed to be in the local timezone when in
+ fact it was in UTC. Thanks to Ed Ravin. #1268
+ * BIND plugin: Memory leaks have been fixed. Thanks to Ruben Kerkhof.
+ #2303
+ * cURL-JSON plugin: Handling of arrays has been fixed. Thanks to Florian
+ Forster. #2266
+ * DPDKStat plugin: Error handling during initialization has been
+ improved. Thanks to Ruben Kerkhof.
+ * DPDKStat plugin: Handling of a number of metrics has been improved,
+ for example "rx_q0bytes". Thanks to Przemyslaw Szczerbik. #2167
+ * Intel RDT plugin: Configuration handling has been changed to be more
+ graceful. Thanks to Maryam Tahhan. #2165
+ * Log Logstash plugin: If writing the log entry fails, print it to
+ "STDERR" instead. Thanks to Marc Fournier.
+ * LogFile plugin: If writing to the file fails, print log messages on
+ "STDERR" instead. Thanks to Marc Fournier.
+ * memcachec, Tail plugins: A resource leak in the matching
+ infrastructure has been fixed. Thanks to Krzysztof Matczak. #2192
+ * MQTT plugin: Invalid symbols in topic names are now replaced and a
+ resource leak has been fixed. Thanks to Denys Fedoryshchenko. #2123
+ * Network plugin: A potential endless-loop has been fixed. This can be
+ triggered remotely by sending a signed network packet to a server
+ which is not set up to check signatures. Thanks to Marcin Kozlowski
+ and Pavel Rochnyack. #2174, #2233, CVE-2017-7401
+ * Perl plugin: A potential double-free has been fixed. Thanks to Florian
+ Forster. #2278
+ * Processes plugin: A compilation error on AIX has been fixed. Thanks to
+ Pavel Rochnyack. #2210
+ * SMART plugin: A check for the "CAP_SYS_RAWIO" capability has been
+ added. Thanks to Marc Fournier.
+ * Write Graphite plugin: Error handling in the case that calculating a
+ metric's rate fails has been improved. Previously, the raw counter
+ values were sent to Graphite. Thanks to Iain Buclaw. #2209
+ * Write Prometheus plugin: An incorrect use of "realloc(3)" has been
+ fixed. Thanks to Florian Forster. #2275
+
2017-01-23, Version 5.7.1
* collectd: Handling of boolean configuration options has been unified.
Thanks to Sebastian Harl. #2083, #2098
* Private functions
*/
static int email_config(const char *key, const char *value) {
- if (0 == strcasecmp(key, "SocketFile")) {
- if (NULL != sock_file)
+ if (strcasecmp(key, "SocketFile") == 0) {
+ if (sock_file != NULL)
free(sock_file);
sock_file = sstrdup(value);
- } else if (0 == strcasecmp(key, "SocketGroup")) {
- if (NULL != sock_group)
+ } else if (strcasecmp(key, "SocketGroup") == 0) {
+ if (sock_group != NULL)
free(sock_group);
sock_group = sstrdup(value);
- } else if (0 == strcasecmp(key, "SocketPerms")) {
+ } else if (strcasecmp(key, "SocketPerms") == 0) {
/* the user is responsible for providing reasonable values */
sock_perms = (int)strtol(value, NULL, 8);
- } else if (0 == strcasecmp(key, "MaxConns")) {
+ } else if (strcasecmp(key, "MaxConns") == 0) {
long int tmp = strtol(value, NULL, 0);
if (tmp < 1) {
/* Increment the value of the given name in the given list by incr. */
static void type_list_incr(type_list_t *list, char *name, int incr) {
- if (NULL == list->head) {
+ if (list->head == NULL) {
list->head = smalloc(sizeof(*list->head));
list->head->name = sstrdup(name);
type_t *ptr;
for (ptr = list->head; NULL != ptr; ptr = ptr->next) {
- if (0 == strcmp(name, ptr->name))
+ if (strcmp(name, ptr->name) == 0)
break;
}
- if (NULL == ptr) {
+ if (ptr == NULL) {
list->tail->next = smalloc(sizeof(*list->tail->next));
list->tail = list->tail->next;
pthread_mutex_lock(&conns_mutex);
- while (NULL == conns.head) {
+ while (conns.head == NULL) {
pthread_cond_wait(&conn_available, &conns_mutex);
}
connection = conns.head;
conns.head = conns.head->next;
- if (NULL == conns.head) {
+ if (conns.head == NULL) {
conns.tail = NULL;
}
int len = 0;
errno = 0;
- if (NULL == fgets(line, sizeof(line), this->socket)) {
- if (0 != errno) {
+ if (fgets(line, sizeof(line), this->socket) == NULL) {
+ if (errno != 0) {
char errbuf[1024];
log_err("collect: reading from socket (fd #%i) "
"failed: %s",
}
len = strlen(line);
- if (('\n' != line[len - 1]) && ('\r' != line[len - 1])) {
+ if ((line[len - 1] != '\n') && (line[len - 1] != '\r')) {
log_warn("collect: line too long (> %zu characters): "
"'%s' (truncated)",
sizeof(line) - 1, line);
- while (NULL != fgets(line, sizeof(line), this->socket))
- if (('\n' == line[len - 1]) || ('\r' == line[len - 1]))
+ while (fgets(line, sizeof(line), this->socket) != NULL)
+ if ((line[len - 1] == '\n') || (line[len - 1] == '\r'))
break;
continue;
}
log_debug("collect: line = '%s'", line);
- if (':' != line[1]) {
+ if (line[1] != ':') {
log_err("collect: syntax error in line '%s'", line);
continue;
}
- if ('e' == line[0]) { /* e:<type>:<bytes> */
+ if (line[0] == 'e') { /* e:<type>:<bytes> */
char *ptr = NULL;
char *type = strtok_r(line + 2, ":", &ptr);
char *tmp = strtok_r(NULL, ":", &ptr);
int bytes = 0;
- if (NULL == tmp) {
+ if (tmp == NULL) {
log_err("collect: syntax error in line '%s'", line);
continue;
}
type_list_incr(&list_size, type, /* increment = */ bytes);
pthread_mutex_unlock(&size_mutex);
}
- } else if ('s' == line[0]) { /* s:<value> */
+ } else if (line[0] == 's') { /* s:<value> */
pthread_mutex_lock(&score_mutex);
score = (score * (double)score_count + atof(line + 2)) /
(double)(score_count + 1);
++score_count;
pthread_mutex_unlock(&score_mutex);
- } else if ('c' == line[0]) { /* c:<type1>[,<type2>,...] */
+ } else if (line[0] == 'c') { /* c:<type1>[,<type2>,...] */
char *dummy = line + 2;
char *endptr = NULL;
char *type;
/* create UNIX socket */
errno = 0;
- if (-1 == (connector_socket = socket(PF_UNIX, SOCK_STREAM, 0))) {
+ if ((connector_socket = socket(PF_UNIX, SOCK_STREAM, 0)) == -1) {
char errbuf[1024];
disabled = 1;
log_err("socket() failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
sstrncpy(addr.sun_path, path, (size_t)(UNIX_PATH_MAX - 1));
errno = 0;
- if (-1 ==
- bind(connector_socket, (struct sockaddr *)&addr,
- offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path))) {
+ if (bind(connector_socket, (struct sockaddr *)&addr,
+ offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path)) == -1) {
char errbuf[1024];
disabled = 1;
close(connector_socket);
}
errno = 0;
- if (-1 == listen(connector_socket, 5)) {
+ if (listen(connector_socket, 5) == -1) {
char errbuf[1024];
disabled = 1;
close(connector_socket);
{
struct group sg;
struct group *grp;
- char grbuf[2048];
+ char grbuf[4096];
int status;
grp = NULL;
if (status != 0) {
char errbuf[1024];
log_warn("getgrnam_r (%s) failed: %s", group,
- sstrerror(errno, errbuf, sizeof(errbuf)));
+ sstrerror(status, errbuf, sizeof(errbuf)));
} else if (grp == NULL) {
log_warn("No such group: `%s'", group);
} else {
}
errno = 0;
- if (0 != chmod(path, sock_perms)) {
+ if (chmod(path, sock_perms) != 0) {
char errbuf[1024];
log_warn("chmod() failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
}
pthread_mutex_lock(&available_mutex);
- while (0 == available_collectors) {
+ while (available_collectors == 0) {
pthread_cond_wait(&collector_available, &available_mutex);
}
connection->socket = fdopen(remote, "r");
connection->next = NULL;
- if (NULL == connection->socket) {
+ if (connection->socket == NULL) {
close(remote);
sfree(connection);
continue;
pthread_mutex_lock(&conns_mutex);
- if (NULL == conns.head) {
+ if (conns.head == NULL) {
conns.head = connection;
conns.tail = connection;
} else {
type_list_free(&list_check);
type_list_free(&list_check_copy);
- unlink((NULL == sock_file) ? SOCK_PATH : sock_file);
+ unlink((sock_file == NULL) ? SOCK_PATH : sock_file);
sfree(sock_file);
sfree(sock_group);
static void copy_type_list(type_list_t *l1, type_list_t *l2) {
type_t *last = NULL;
- for (type_t *ptr1 = l1->head, *ptr2 = l2->head; NULL != ptr1;
+ for (type_t *ptr1 = l1->head, *ptr2 = l2->head; ptr1 != NULL;
ptr1 = ptr1->next, last = ptr2, ptr2 = ptr2->next) {
- if (NULL == ptr2) {
+ if (ptr2 == NULL) {
ptr2 = smalloc(sizeof(*ptr2));
ptr2->name = NULL;
ptr2->next = NULL;
- if (NULL == last) {
+ if (last == NULL) {
l2->head = ptr2;
} else {
last->next = ptr2;
l2->tail = ptr2;
}
- if (NULL == ptr2->name) {
+ if (ptr2->name == NULL) {
ptr2->name = sstrdup(ptr1->name);
}
pthread_mutex_unlock(&count_mutex);
- for (type_t *ptr = list_count_copy.head; NULL != ptr; ptr = ptr->next) {
+ for (type_t *ptr = list_count_copy.head; ptr != NULL; ptr = ptr->next) {
email_submit("email_count", ptr->name, ptr->value);
}
pthread_mutex_unlock(&size_mutex);
- for (type_t *ptr = list_size_copy.head; NULL != ptr; ptr = ptr->next) {
+ for (type_t *ptr = list_size_copy.head; ptr != NULL; ptr = ptr->next) {
email_submit("email_size", ptr->name, ptr->value);
}
pthread_mutex_unlock(&check_mutex);
- for (type_t *ptr = list_check_copy.head; NULL != ptr; ptr = ptr->next)
+ for (type_t *ptr = list_check_copy.head; ptr != NULL; ptr = ptr->next)
email_submit("spam_check", ptr->name, ptr->value);
return 0;