Code

snmp plugin: Reworked/fixed res->errstat check
authorPavel Rochnyack <pavel2000@ngs.ru>
Tue, 26 Sep 2017 19:01:14 +0000 (02:01 +0700)
committerPavel Rochnyack <pavel2000@ngs.ru>
Tue, 26 Sep 2017 19:13:57 +0000 (02:13 +0700)
src/snmp.c

index 2b1dd0446e690e0eac8856a1bb73d6947186697c..8faccbe9548088a404eaabe97370027ac12aa5c2 100644 (file)
@@ -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);