From: Florian Forster Date: Mon, 22 Sep 2008 11:57:29 +0000 (+0200) Subject: snmp plugin: Improve parsing of strings to values. X-Git-Tag: collectd-4.5.1~12 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=8faf4450ab7019e8931eca3343d43c79c37701d3;p=collectd.git snmp plugin: Improve parsing of strings to values. 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. --- diff --git a/src/snmp.c b/src/snmp.c index 877aafe9..4d6e7694 100644 --- a/src/snmp.c +++ b/src/snmp.c @@ -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;