Code

openvpn: Fixed openvpn_read() on empty configuration.
[collectd.git] / src / openvpn.c
index 8bccce3883a88664598416dbc5a7e0c676c9a051..be9a4dc863e383ca006660faeb3501c7020436b1 100644 (file)
@@ -26,6 +26,7 @@
  **/
 
 #include "collectd.h"
+
 #include "common.h"
 #include "plugin.h"
 
@@ -521,12 +522,15 @@ static int multi4_read (const char *name, FILE *fh)
 static int openvpn_read (void)
 {
        FILE *fh;
-       int  i, read;
+       int  read;
 
        read = 0;
+       
+       if (vpn_num == 0)
+               return (0);
 
        /* call the right read function for every status entry in the list */
-       for (i = 0; i < vpn_num; i++)
+       for (int i = 0; i < vpn_num; i++)
        {
                int vpn_read = 0;
 
@@ -650,7 +654,7 @@ static int openvpn_config (const char *key, const char *value)
        if (strcasecmp ("StatusFile", key) == 0)
        {
                char    *status_file, *status_name, *filename;
-               int     status_version, i;
+               int     status_version;
                vpn_status_t *temp;
 
                /* try to detect the status file format */
@@ -658,8 +662,8 @@ static int openvpn_config (const char *key, const char *value)
 
                if (status_version == 0)
                {
-                       WARNING ("openvpn plugin: unable to detect status version, \
-                                       discarding status file \"%s\".", value);
+                       WARNING ("openvpn plugin: unable to detect status version, "
+                                       "discarding status file \"%s\".", value);
                        return (1);
                }
 
@@ -686,7 +690,7 @@ static int openvpn_config (const char *key, const char *value)
                }
 
                /* scan the list looking for a clone */
-               for (i = 0; i < vpn_num; i++)
+               for (int i = 0; i < vpn_num; i++)
                {
                        if (strcasecmp (vpn_list[i]->name, status_name) == 0)
                        {
@@ -699,7 +703,7 @@ static int openvpn_config (const char *key, const char *value)
                }
 
                /* create a new vpn element since file, version and name are ok */
-               temp = (vpn_status_t *) malloc (sizeof (vpn_status_t));
+               temp = malloc (sizeof (*temp));
                if (temp == NULL)
                {
                        char errbuf[1024];
@@ -712,17 +716,19 @@ static int openvpn_config (const char *key, const char *value)
                temp->version = status_version;
                temp->name = status_name;
 
-               vpn_list = (vpn_status_t **) realloc (vpn_list, (vpn_num + 1) * sizeof (vpn_status_t *));
-               if (vpn_list == NULL)
+               vpn_status_t **tmp_list = realloc (vpn_list, (vpn_num + 1) * sizeof (*vpn_list));
+               if (tmp_list == NULL)
                {
                        char errbuf[1024];
                        ERROR ("openvpn plugin: realloc failed: %s",
                                        sstrerror (errno, errbuf, sizeof (errbuf)));
 
+                       sfree (vpn_list);
                        sfree (temp->file);
                        sfree (temp);
                        return (1);
                }
+               vpn_list = tmp_list;
 
                vpn_list[vpn_num] = temp;
                vpn_num++;
@@ -775,9 +781,7 @@ static int openvpn_config (const char *key, const char *value)
 /* shutdown callback */
 static int openvpn_shutdown (void)
 {
-       int i;
-
-       for (i = 0; i < vpn_num; i++)
+       for (int i = 0; i < vpn_num; i++)
        {
                sfree (vpn_list[i]->file);
                sfree (vpn_list[i]);