X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsnmp.c;h=995f39deff913ee77a9cf807f12d323635236a85;hb=86278412535aeeb0e8e2c50df9029f1b0920e4d8;hp=2026e8bc4151c5ebbb86ec48d2f24c4a8a25fd1e;hpb=5e700757575fa6606cf201947cb0efb57ce12e6d;p=collectd.git diff --git a/src/snmp.c b/src/snmp.c index 2026e8bc..995f39de 100644 --- a/src/snmp.c +++ b/src/snmp.c @@ -692,6 +692,7 @@ static void csnmp_host_open_session (host_definition_t *host) } } /* void csnmp_host_open_session */ +/* TODO: Check if negative values wrap around. Problem: negative temperatures. */ static value_t csnmp_value_list_to_value (struct variable_list *vl, int type, double scale, double shift) { @@ -729,22 +730,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; @@ -859,22 +879,15 @@ static int csnmp_instance_list_add (csnmp_list_instances_t **head, char *ptr; size_t instance_len; + memset (il->instance, 0, sizeof (il->instance)); instance_len = sizeof (il->instance) - 1; if (instance_len > vb->val_len) instance_len = vb->val_len; - if (instance_len < 1) - { - ERROR ("snmp plugin: csnmp_instance_list_add: instance_len = %zu, " - "which is less than one.", instance_len); - sfree (il); - return (-1); - } - sstrncpy (il->instance, (char *) ((vb->type == ASN_OCTET_STR) ? vb->val.string : vb->val.bitstring), - instance_len); + instance_len + 1); for (ptr = il->instance; *ptr != '\0'; ptr++) { @@ -1153,10 +1166,6 @@ static int csnmp_read_table (host_definition_t *host, data_definition_t *data) vb = res->variables; if (vb == NULL) { - if (res != NULL) - snmp_free_pdu (res); - res = NULL; - status = -1; break; } @@ -1165,10 +1174,7 @@ static int csnmp_read_table (host_definition_t *host, data_definition_t *data) * subtree */ if (csnmp_check_res_left_subtree (host, data, res) != 0) { - if (res != NULL) - snmp_free_pdu (res); - res = NULL; - + status = 0; break; } @@ -1190,11 +1196,7 @@ static int csnmp_read_table (host_definition_t *host, data_definition_t *data) (vb != NULL) && (vb->next_variable != NULL); vb = vb->next_variable) /* do nothing */; - if (vb == NULL) - { - status = -1; - break; - } + assert (vb != NULL); /* Copy OID to oid_list[data->values_len] */ memcpy (oid_list[data->values_len].oid, vb->name, @@ -1257,6 +1259,10 @@ static int csnmp_read_table (host_definition_t *host, data_definition_t *data) res = NULL; } /* while (status == 0) */ + if (res != NULL) + snmp_free_pdu (res); + res = NULL; + if (status == 0) csnmp_dispatch_table (host, data, instance_list, value_table);