unnecessary SNMP key recalculation eliminated
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 1 Jun 2017 08:47:33 +0000 (11:47 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 1 Jun 2017 08:47:33 +0000 (11:47 +0300)
include/nxsnmp.h
src/server/core/node.cpp
src/snmp/libnxsnmp/security.cpp

index 9752cfb..3244866 100644 (file)
@@ -514,7 +514,7 @@ public:
        void setPrivPassword(const char *password);
        void setAuthMethod(int method) { m_authMethod = method; }
        void setPrivMethod(int method) { m_privMethod = method; }
-       void setSecurityModel(int model) { m_securityModel = model; }
+       void setSecurityModel(int model);
        void setContextName(const TCHAR *name);
 #ifdef UNICODE
        void setContextNameA(const char *name);
index 417ee3f..6fe4874 100644 (file)
@@ -351,8 +351,20 @@ bool Node::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
    DBGetFieldA(hResult, 0, 21, snmpPrivPassword, 256);
    int snmpMethods = DBGetFieldLong(hResult, 0, 22);
    delete m_snmpSecurity;
-   m_snmpSecurity = new SNMP_SecurityContext(snmpAuthObject, snmpAuthPassword, snmpPrivPassword, snmpMethods & 0xFF, snmpMethods >> 8);
-   m_snmpSecurity->setSecurityModel((m_snmpVersion == SNMP_VERSION_3) ? SNMP_SECURITY_MODEL_USM : SNMP_SECURITY_MODEL_V2C);
+   if (m_snmpVersion == SNMP_VERSION_3)
+   {
+      m_snmpSecurity = new SNMP_SecurityContext(snmpAuthObject, snmpAuthPassword, snmpPrivPassword, snmpMethods & 0xFF, snmpMethods >> 8);
+   }
+   else
+   {
+      // This will create security context with V2C security model
+      // USM fields will be loaded but keys will not be calculated
+      m_snmpSecurity = new SNMP_SecurityContext(snmpAuthObject);
+      m_snmpSecurity->setAuthMethod(snmpMethods & 0xFF);
+      m_snmpSecurity->setAuthPassword(snmpAuthPassword);
+      m_snmpSecurity->setPrivMethod(snmpMethods >> 8);
+      m_snmpSecurity->setPrivPassword(snmpPrivPassword);
+   }
 
    m_sysName = DBGetField(hResult, 0, 23, NULL, 0);
 
index e7ffc55..da4a8b0 100644 (file)
@@ -144,18 +144,27 @@ void SNMP_SecurityContext::setContextName(const TCHAR *name)
  */
 void SNMP_SecurityContext::setContextNameA(const char *name)
 {
-       safe_free(m_contextName);
+       free(m_contextName);
        m_contextName = (name != NULL) ? strdup(name) : NULL;
 }
 
 #endif
 
 /**
+ * Set security model
+ */
+void SNMP_SecurityContext::setSecurityModel(int model)
+{
+   m_securityModel = model;
+   recalculateKeys();
+}
+
+/**
  * Set authentication name
  */
 void SNMP_SecurityContext::setAuthName(const char *name)
 {
-       safe_free(m_authName);
+       free(m_authName);
        m_authName = strdup(CHECK_NULL_EX_A(name));
 }
 
@@ -164,7 +173,9 @@ void SNMP_SecurityContext::setAuthName(const char *name)
  */
 void SNMP_SecurityContext::setAuthPassword(const char *password)
 {
-       safe_free(m_authPassword);
+   if ((m_authPassword != NULL) && !strcmp(CHECK_NULL_EX_A(password), m_authPassword))
+      return;
+       free(m_authPassword);
        m_authPassword = strdup(CHECK_NULL_EX_A(password));
        recalculateKeys();
 }
@@ -174,7 +185,9 @@ void SNMP_SecurityContext::setAuthPassword(const char *password)
  */
 void SNMP_SecurityContext::setPrivPassword(const char *password)
 {
-       safe_free(m_privPassword);
+   if ((m_privPassword != NULL) && !strcmp(CHECK_NULL_EX_A(password), m_privPassword))
+      return;
+       free(m_privPassword);
        m_privPassword = strdup(CHECK_NULL_EX_A(password));
        recalculateKeys();
 }
@@ -193,6 +206,9 @@ void SNMP_SecurityContext::setAuthoritativeEngine(const SNMP_Engine &engine)
  */
 void SNMP_SecurityContext::recalculateKeys()
 {
+   if (m_securityModel != SNMP_SECURITY_MODEL_USM)
+      return;  // no need to recalculate keys
+
        BYTE buffer[256];
        const char *authPassword = (m_authPassword != NULL) ? m_authPassword : "";
        const char *privPassword = (m_privPassword != NULL) ? m_privPassword : "";