Merge branch 'collectd-5.4'
[collectd.git] / src / network.c
index ce9b0cc..701571d 100644 (file)
@@ -917,15 +917,19 @@ static int parse_part_number (void **ret_buffer, size_t *ret_buffer_len,
 } /* int parse_part_number */
 
 static int parse_part_string (void **ret_buffer, size_t *ret_buffer_len,
-               char *output, int output_len)
+               char *output, size_t const output_len)
 {
        char *buffer = *ret_buffer;
        size_t buffer_len = *ret_buffer_len;
 
        uint16_t tmp16;
-       size_t header_size = 2 * sizeof (uint16_t);
+       size_t const header_size = 2 * sizeof (uint16_t);
 
        uint16_t pkg_length;
+       size_t payload_size;
+
+       if (output_len <= 0)
+               return (EINVAL);
 
        if (buffer_len < header_size)
        {
@@ -944,6 +948,7 @@ static int parse_part_string (void **ret_buffer, size_t *ret_buffer_len,
        memcpy ((void *) &tmp16, buffer, sizeof (tmp16));
        buffer += sizeof (tmp16);
        pkg_length = ntohs (tmp16);
+       payload_size = ((size_t) pkg_length) - header_size;
 
        /* Check that packet fits in the input buffer */
        if (pkg_length > buffer_len)
@@ -969,22 +974,24 @@ static int parse_part_string (void **ret_buffer, size_t *ret_buffer_len,
        /* Check that the package data fits into the output buffer.
         * The previous if-statement ensures that:
         * `pkg_length > header_size' */
-       if ((output_len < 0)
-                       || ((size_t) output_len < ((size_t) pkg_length - header_size)))
+       if (output_len < payload_size)
        {
                WARNING ("network plugin: parse_part_string: "
-                               "Output buffer too small.");
+                               "Buffer too small: "
+                               "Output buffer holds %zu bytes, "
+                               "which is too small to hold the received "
+                               "%zu byte string.",
+                               output_len, payload_size);
                return (-1);
        }
 
        /* All sanity checks successfull, let's copy the data over */
-       output_len = pkg_length - header_size;
-       memcpy ((void *) output, (void *) buffer, output_len);
-       buffer += output_len;
+       memcpy ((void *) output, (void *) buffer, payload_size);
+       buffer += payload_size;
 
        /* For some very weird reason '\0' doesn't do the trick on SPARC in
         * this statement. */
-       if (output[output_len - 1] != 0)
+       if (output[payload_size - 1] != 0)
        {
                WARNING ("network plugin: parse_part_string: "
                                "Received string does not end "
@@ -2973,6 +2980,10 @@ static int network_config_set_ttl (const oconfig_item_t *ci) /* {{{ */
   tmp = (int) ci->values[0].value.number;
   if ((tmp > 0) && (tmp <= 255))
     network_config_ttl = tmp;
+  else {
+    WARNING ("network plugin: The `TimeToLive' must be between 1 and 255.");
+    return (-1);    
+  }
 
   return (0);
 } /* }}} int network_config_set_ttl */
@@ -3244,6 +3255,14 @@ static int network_config (oconfig_item_t *ci) /* {{{ */
 {
   int i;
 
+  /* The options need to be applied first */
+  for (i = 0; i < ci->children_num; i++)
+  {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp ("TimeToLive", child->key) == 0)
+      network_config_set_ttl (child);
+  }
+
   for (i = 0; i < ci->children_num; i++)
   {
     oconfig_item_t *child = ci->children + i;
@@ -3252,8 +3271,9 @@ static int network_config (oconfig_item_t *ci) /* {{{ */
       network_config_add_listen (child);
     else if (strcasecmp ("Server", child->key) == 0)
       network_config_add_server (child);
-    else if (strcasecmp ("TimeToLive", child->key) == 0)
-      network_config_set_ttl (child);
+    else if (strcasecmp ("TimeToLive", child->key) == 0) {
+      /* Handled earlier */
+    }
     else if (strcasecmp ("MaxPacketSize", child->key) == 0)
       network_config_set_buffer_size (child);
     else if (strcasecmp ("Forward", child->key) == 0)