additional response consistency control for AgentConnection::getParameter
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 15 May 2017 14:44:37 +0000 (17:44 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 15 May 2017 14:44:37 +0000 (17:44 +0300)
include/nms_agent.h
src/server/core/node.cpp
src/server/libnxsrv/agent.cpp

index 262d99a..eca8810 100644 (file)
 #define ERR_NO_SUCH_INSTANCE        ((UINT32)921)
 #define ERR_OUT_OF_STATE_REQUEST    ((UINT32)922)
 #define ERR_ENCRYPTION_ERROR        ((UINT32)923)
+#define ERR_MALFORMED_RESPONSE      ((UINT32)924)
 
 /**
  * Bulk data reconciliation DCI processing status codes
index a8d7f47..6c0e725 100644 (file)
@@ -4215,11 +4215,11 @@ UINT32 Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szB
             break;
          case ERR_REQUEST_TIMEOUT:
             // Reset connection to agent after timeout
-            DbgPrintf(7, _T("Node(%s)->GetItemFromAgent(%s): timeout; resetting connection to agent..."), m_name, szParam);
+            nxlog_debug(7, _T("Node(%s)->GetItemFromAgent(%s): timeout; resetting connection to agent..."), m_name, szParam);
             deleteAgentConnection();
             if (!connectToAgent())
                goto end_loop;
-            DbgPrintf(7, _T("Node(%s)->GetItemFromAgent(%s): connection to agent restored successfully"), m_name, szParam);
+            nxlog_debug(7, _T("Node(%s)->GetItemFromAgent(%s): connection to agent restored successfully"), m_name, szParam);
             break;
          case ERR_INTERNAL_ERROR:
             dwResult = DCE_COLLECTION_ERROR;
@@ -4230,7 +4230,7 @@ UINT32 Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szB
 
 end_loop:
    agentUnlock();
-   DbgPrintf(7, _T("Node(%s)->GetItemFromAgent(%s): dwError=%d dwResult=%d"), m_name, szParam, dwError, dwResult);
+   nxlog_debug(7, _T("Node(%s)->GetItemFromAgent(%s): dwError=%d dwResult=%d"), m_name, szParam, dwError, dwResult);
    return dwResult;
 }
 
index 12d3124..969943b 100644 (file)
@@ -916,7 +916,17 @@ UINT32 AgentConnection::getParameter(const TCHAR *pszParam, UINT32 dwBufSize, TC
       {
          dwRetCode = response->getFieldAsUInt32(VID_RCC);
          if (dwRetCode == ERR_SUCCESS)
-            response->getFieldAsString(VID_VALUE, pszBuffer, dwBufSize);
+         {
+            if (response->isFieldExist(VID_VALUE))
+            {
+               response->getFieldAsString(VID_VALUE, pszBuffer, dwBufSize);
+            }
+            else
+            {
+               dwRetCode = ERR_MALFORMED_RESPONSE;
+               debugPrintf(3, _T("Malformed response to CMD_GET_PARAMETER"));
+            }
+         }
          delete response;
       }
       else