summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9816488)
raw | patch | inline | side by side (parent: 9816488)
author | Pavel Rochnyack <pavel2000@ngs.ru> | |
Tue, 26 Sep 2017 19:01:14 +0000 (02:01 +0700) | ||
committer | Pavel Rochnyack <pavel2000@ngs.ru> | |
Tue, 26 Sep 2017 19:13:57 +0000 (02:13 +0700) |
src/snmp.c | patch | blob | history |
diff --git a/src/snmp.c b/src/snmp.c
index 2b1dd0446e690e0eac8856a1bb73d6947186697c..8faccbe9548088a404eaabe97370027ac12aa5c2 100644 (file)
--- a/src/snmp.c
+++ b/src/snmp.c
@@ -1389,35 +1389,47 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
}
if (res->errstat != SNMP_ERR_NOERROR) {
- if (res->errindex != 0 && res->errindex < oid_list_len) {
+ if (res->errindex != 0) {
/* Find the OID which caused error */
for (i = 1, vb = res->variables; vb != NULL && i != res->errindex;
vb = vb->next_variable, i++)
/* do nothing */;
+ }
+
+ if ((res->errindex == 0) || (vb == NULL)) {
+ ERROR("snmp plugin: host %s; data %s: response error: %s (%li) ",
+ host->name, data->name, snmp_errstring(res->errstat),
+ res->errstat);
+ status = -1;
+ break;
+ }
- char oid_buffer[1024] = {0};
- snprint_objid(oid_buffer, sizeof(oid_buffer) - 1, vb->name,
- vb->name_length);
- NOTICE("snmp plugin: host %s; data %s: OID `%s` failed: %s",
- host->name, data->name, oid_buffer,
- snmp_errstring(res->errstat));
+ char oid_buffer[1024] = {0};
+ snprint_objid(oid_buffer, sizeof(oid_buffer) - 1, vb->name,
+ vb->name_length);
+ NOTICE("snmp plugin: host %s; data %s: OID `%s` failed: %s", host->name,
+ data->name, oid_buffer, snmp_errstring(res->errstat));
- /* Skip that OID */
- i = res->errindex - 1;
+ /* Calculate value index from todo list and skip OID found */
+ i = 0;
+ size_t j = 1;
+ for (;;) {
while ((i < oid_list_len) && !oid_list_todo[i])
i++;
- oid_list_todo[i] = 0;
+ if (j == res->errindex)
+ break;
- snmp_free_pdu(res);
- res = NULL;
- continue;
+ i++;
+ j++;
}
- ERROR("snmp plugin: host %s; data %s: response error: %s (%li) ",
- host->name, data->name, snmp_errstring(res->errstat), res->errstat);
- status = -1;
- break;
+ assert(i < oid_list_len);
+ oid_list_todo[i] = 0;
+
+ snmp_free_pdu(res);
+ res = NULL;
+ continue;
}
for (vb = res->variables, i = 0; (vb != NULL);