summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: df2ae7a)
raw | patch | inline | side by side (parent: df2ae7a)
author | Florian Forster <octo@noris.net> | |
Mon, 22 Sep 2008 11:57:29 +0000 (13:57 +0200) | ||
committer | Florian 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.
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 | patch | blob | history |
diff --git a/src/snmp.c b/src/snmp.c
index 877aafe92b2bf959f8604916776020460b847ea2..4d6e76947a37ef983c7180debff49dfc1c25f6c0 100644 (file)
--- a/src/snmp.c
+++ b/src/snmp.c
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;