Code

snmp plugin: Improve parsing of strings to values.
authorFlorian Forster <octo@noris.net>
Mon, 22 Sep 2008 11:57:29 +0000 (13:57 +0200)
committerFlorian Forster <octo@noris.net>
Mon, 22 Sep 2008 11:57:29 +0000 (13:57 +0200)
The ``strings'' returned by the Net-SNMP library may not be null
terminated. What the fuck were those guys thinking? At least there's a
`val_len' member in `struct variable_list' we can use to determine the
amount of bytes we need to copy.

src/snmp.c

index 877aafe92b2bf959f8604916776020460b847ea2..4d6e76947a37ef983c7180debff49dfc1c25f6c0 100644 (file)
@@ -729,22 +729,41 @@ static value_t csnmp_value_list_to_value (struct variable_list *vl, int type,
 
   if (vl->type == ASN_OCTET_STR)
   {
-    char *string;
     char *endptr;
 
-    string = (char *) vl->val.string;
     endptr = NULL;
-
-    if (string != NULL)
+    if (vl->val.string != NULL)
     {
+      char string[64];
+      size_t string_length;
+
+      string_length = sizeof (string) - 1;
+      if (vl->val_len < string_length)
+       string_length = vl->val_len;
+
+      /* The strings we get from the Net-SNMP library may not be null
+       * terminated. That is why we're using `membpy' here and not `strcpy'.
+       * `string_length' is set to `vl->val_len' which holds the length of the
+       * string.  -octo */
+      memcpy (string, vl->val.string, string_length);
+      string[string_length] = 0;
+
       if (type == DS_TYPE_COUNTER)
+      {
        ret.counter = (counter_t) strtoll (string, &endptr, /* base = */ 0);
+       DEBUG ("snmp plugin: csnmp_value_list_to_value: String to counter: %s -> %llu",
+           string, (unsigned long long) ret.counter);
+      }
       else if (type == DS_TYPE_GAUGE)
+      {
        ret.gauge = (gauge_t) strtod (string, &endptr);
+       DEBUG ("snmp plugin: csnmp_value_list_to_value: String to gauge: %s -> %g",
+           string, (double) ret.gauge);
+      }
     }
 
     /* Check if an error occurred */
-    if ((string == NULL) || (endptr == string))
+    if ((vl->val.string == NULL) || (endptr == (char *) vl->val.string))
     {
       if (type == DS_TYPE_COUNTER)
        ret.counter = 0;