From 8faf4450ab7019e8931eca3343d43c79c37701d3 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Mon, 22 Sep 2008 13:57:29 +0200 Subject: [PATCH] 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. --- src/snmp.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) 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; -- 2.30.2