Merge branch 'collectd-5.6'
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Wed, 26 Oct 2016 17:33:44 +0000 (19:33 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Wed, 26 Oct 2016 17:33:44 +0000 (19:33 +0200)
1  2 
src/daemon/common.c
src/write_http.c

diff --combined src/daemon/common.c
@@@ -339,60 -339,50 +339,60 @@@ int strsplit (char *string, char **fiel
        return ((int) i);
  }
  
 -int strjoin (char *buffer, size_t buffer_size,
 -              char **fields, size_t fields_num,
 -              const char *sep)
 -{
 -      size_t avail;
 -      char *ptr;
 -      size_t sep_len;
 +int strjoin(char *buffer, size_t buffer_size, char **fields, size_t fields_num,
 +            const char *sep) {
 +  size_t avail = 0;
 +  char *ptr = buffer;
 +  size_t sep_len = 0;
  
 -      if ((buffer_size < 1) || (fields_num == 0))
 -              return (-1);
 +  size_t buffer_req = 0;
  
 -      memset (buffer, 0, buffer_size);
 -      ptr = buffer;
 -      avail = buffer_size - 1;
 +  if (((fields_num != 0) && (fields == NULL)) ||
 +      ((buffer_size != 0) && (buffer == NULL)))
 +    return (-EINVAL);
  
 -      sep_len = 0;
 -      if (sep != NULL)
 -              sep_len = strlen (sep);
 +  if (buffer != NULL)
 +    buffer[0] = 0;
  
 -      for (size_t i = 0; i < fields_num; i++)
 -      {
 -              size_t field_len;
 +  if (buffer_size != 0)
 +    avail = buffer_size - 1;
  
 -              if ((i > 0) && (sep_len > 0))
 -              {
 -                      if (avail < sep_len)
 -                              return (-1);
 +  if (sep != NULL)
 +    sep_len = strlen(sep);
  
 -                      memcpy (ptr, sep, sep_len);
 -                      ptr += sep_len;
 -                      avail -= sep_len;
 -              }
 +  for (size_t i = 0; i < fields_num; i++) {
 +    size_t field_len = strlen(fields[i]);
  
 -              field_len = strlen (fields[i]);
 -              if (avail < field_len)
 -                      return (-1);
 +    if (i != 0)
 +      buffer_req += sep_len;
 +    buffer_req += field_len;
  
 -              memcpy (ptr, fields[i], field_len);
 -              ptr += field_len;
 -              avail -= field_len;
 -      }
 +    if ((i != 0) && (sep_len > 0)) {
 +      if (sep_len >= avail) {
 +        /* prevent subsequent iterations from writing to the
 +         * buffer. */
 +        avail = 0;
 +        continue;
 +      }
  
 -      assert (buffer[buffer_size - 1] == 0);
 -      return ((int) strlen (buffer));
 +      memcpy(ptr, sep, sep_len);
 +
 +      ptr += sep_len;
 +      avail -= sep_len;
 +    }
 +
 +    if (field_len > avail)
 +      field_len = avail;
 +
 +    memcpy(ptr, fields[i], field_len);
 +    ptr += field_len;
 +
 +    avail -= field_len;
 +    if (ptr != NULL)
 +      *ptr = 0;
 +  }
 +
 +  return (int)buffer_req;
  }
  
  int escape_string (char *buffer, size_t buffer_size)
@@@ -1016,8 -1006,7 +1016,8 @@@ int format_values (char *ret, size_t re
  
  int parse_identifier (char *str, char **ret_host,
                char **ret_plugin, char **ret_plugin_instance,
 -              char **ret_type, char **ret_type_instance)
 +              char **ret_type, char **ret_type_instance,
 +              char *default_host)
  {
        char *hostname = NULL;
        char *plugin = NULL;
  
        type = strchr (plugin, '/');
        if (type == NULL)
 -              return (-1);
 -      *type = '\0'; type++;
 +      {
 +              if (default_host == NULL)
 +                      return (-1);
 +              /* else: no host specified; use default */
 +              type = plugin;
 +              plugin = hostname;
 +              hostname = default_host;
 +      }
 +      else
 +      {
 +              *type = '\0';
 +              type++;
 +      }
  
        plugin_instance = strchr (plugin, '-');
        if (plugin_instance != NULL)
@@@ -1089,8 -1067,7 +1089,8 @@@ int parse_identifier_vl (const char *st
  
        status = parse_identifier (str_copy, &host,
                        &plugin, &plugin_instance,
 -                      &type, &type_instance);
 +                      &type, &type_instance,
 +                      /* default_host = */ NULL);
        if (status != 0)
                return (status);
  
@@@ -1227,28 -1204,6 +1227,28 @@@ int parse_values (char *buffer, value_l
        return (0);
  } /* int parse_values */
  
 +int parse_value_file (char const *path, value_t *ret_value, int ds_type)
 +{
 +      FILE *fh;
 +      char buffer[256];
 +
 +      fh = fopen (path, "r");
 +      if (fh == NULL)
 +              return (-1);
 +
 +      if (fgets (buffer, sizeof (buffer), fh) == NULL)
 +      {
 +              fclose (fh);
 +              return (-1);
 +      }
 +
 +      fclose (fh);
 +
 +      strstripnewline (buffer);
 +
 +      return parse_value (buffer, ret_value, ds_type);
 +} /* int parse_value_file */
 +
  #if !HAVE_GETPWNAM_R
  int getpwnam_r (const char *name, struct passwd *pwbuf, char *buf,
                size_t buflen, struct passwd **pwbufp)
@@@ -1743,7 -1698,7 +1743,7 @@@ int check_capability (int capability) /
        }
  
        cap_header->pid = getpid();
-       cap_header->version = _LINUX_CAPABILITY_VERSION;
+       cap_header->version = _LINUX_CAPABILITY_VERSION_3;
        if (capget(cap_header, cap_data) < 0)
        {
                ERROR("check_capability: capget failed");
diff --combined src/write_http.c
@@@ -366,7 -366,7 +366,7 @@@ static int wh_write_command (const data
          if ((cb == NULL) || (cb->send_buffer == NULL))
                  return -1;
  
-         if (strcmp (ds->type, vl->type) == 0) {
+         if (strcmp (ds->type, vl->type) != 0) {
                  ERROR ("write_http plugin: DS type does not match "
                                  "value list type");
                  return -1;
          }
          assert (command_len < cb->send_buffer_free);
  
 +        /* Make scan-build happy. */
 +        assert (cb->send_buffer != NULL);
 +
          /* `command_len + 1' because `command_len' does not include the
           * trailing null byte. Neither does `send_buffer_fill'. */
          memcpy (cb->send_buffer + cb->send_buffer_fill,