fixed broken SNMP trap varbind mapping by position (issue #NX-1285)
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 11 Aug 2017 12:07:02 +0000 (15:07 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 11 Aug 2017 12:07:02 +0000 (15:07 +0300)
ChangeLog
src/server/core/snmptrap.cpp
src/snmp/libnxsnmp/pdu.cpp

index ffd8eea..9e46018 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,7 +13,7 @@
        - New attribute "ipAddressList" for class "Interface"
 - Management console:
        - Improved status map
-- Fixed issues: NX-930, NX-1263, NX-1272, NX-1273, NX-1278, NX-1281, NX-1284
+- Fixed issues: NX-930, NX-1263, NX-1272, NX-1273, NX-1278, NX-1281, NX-1284, NX-1285
 
 *
 * 2.1
index 94592a8..57ae320 100644 (file)
 #define BY_POSITION 1
 
 /**
- * Externals
- */
-extern Queue g_nodePollerQueue;
-
-/**
  * Total number of received SNMP traps
  */
 UINT64 g_snmpTrapsReceived = 0;
@@ -386,7 +381,11 @@ static void GenerateTrapEvent(UINT32 dwObjectId, UINT32 dwIndex, SNMP_PDU *pdu,
       if (pm->isPositional())
       {
                        // Extract by varbind position
-         SNMP_Variable *varbind = pdu->getVariable(pm->getPosition());
+         // Position numbering in mapping starts from 1,
+         // SNMP v2/v3 trap contains uptime and trap OID at positions 0 and 1,
+         // so map first mapping position to index 2 and so on
+         int index = (pdu->getVersion() == SNMP_VERSION_1) ? pm->getPosition() - 1 : pm->getPosition() + 1;
+         SNMP_Variable *varbind = pdu->getVariable(index);
          if (varbind != NULL)
          {
                                bool convertToHex = true;
index 91f70e3..4d4395b 100644 (file)
@@ -294,7 +294,7 @@ bool SNMP_PDU::parseTrapPDU(const BYTE *pData, size_t pduLength)
 
             bResult = true;
          }
-         safe_free(oid->value);
+         free(oid->value);
          free(oid);
       }
    }