fixes in on-demand script execution on object; fixed some uninitialized value warnings
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 6 Nov 2014 08:24:17 +0000 (10:24 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 6 Nov 2014 08:24:17 +0000 (10:24 +0200)
include/nxclapi.h
src/java/netxms-client/src/main/java/org/netxms/client/constants/RCC.java
src/java/netxms-client/src/main/resources/messages.properties
src/java/netxms-client/src/main/resources/messages_es.properties
src/java/netxms-client/src/main/resources/messages_ru.properties
src/java/netxms-eclipse/Core/src/org/netxms/ui/eclipse/jobs/LoginJob.java
src/libnetxms/message.cpp
src/libnxcl/main.cpp
src/server/core/nxslext.cpp
src/server/core/session.cpp

index 0245b68..621994c 100644 (file)
@@ -541,6 +541,8 @@ enum
 #define RCC_NO_FDB                   ((UINT32)114)
 #define RCC_NO_LOCATION_HISTORY      ((UINT32)115)
 #define RCC_OBJECT_IN_USE            ((UINT32)116)
+#define RCC_NXSL_COMPILATION_ERROR   ((UINT32)117)
+#define RCC_NXSL_EXECUTION_ERROR     ((UINT32)118)
 
 /**
  * Mask bits for NXCModifyEventTemplate()
index 395c3a1..ae6f09f 100644 (file)
@@ -104,6 +104,8 @@ public final class RCC extends CommonRCC
    public static final int NO_ROUTING_TABLE = 113;
    public static final int NO_FDB = 114;
    public static final int NO_LOCATION_HISTORY = 115;
+   public static final int NXSL_COMPILATION_ERROR = 117;
+   public static final int NXSL_EXECUTION_ERROR = 118;
        
        // SNMP-specific, has no corresponding RCC_xxx constants in C library
        public static final int BAD_MIB_FILE_HEADER = 1001;
index 9702297..31188d4 100644 (file)
@@ -115,6 +115,8 @@ RCC_0113 = Routing table unavailable
 RCC_0114 = Switch forwading database unavailable
 RCC_0115 = Location history not available
 RCC_0116 = Object is in use and cannot be deleted
+RCC_0117 = Script compilation error (%s)
+RCC_0118 = Script execution error (%s)
 RCC_1001 = Bad MIB file header
 RCC_1002 = Bad MIB file data
 RCC_UNKNOWN = Error %d
index 89844b0..9ebb2ed 100644 (file)
@@ -115,6 +115,8 @@ RCC_0113 = Routing table unavailable
 RCC_0114 = Switch forwading database unavailable
 RCC_0115 = Location history not available
 RCC_0116 = Object is in use and cannot be deleted
+RCC_0117 = Script compilation error (%s)
+RCC_0118 = Script execution error (%s)
 RCC_1001 = Error en la cabecera del fichero MIB
 RCC_1002 = Error en los datos del fichero MIB
 RCC_UNKNOWN = Error %d
index d757c5d..b291239 100644 (file)
@@ -115,6 +115,8 @@ RCC_0113 = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u0430\u0440\u0448\u
 RCC_0114 = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 MAC \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430
 RCC_0115 = \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430
 RCC_0116 = \u041e\u0431\u044a\u0435\u043a\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d
+RCC_0117 = \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 (%s)
+RCC_0118 = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 (%s)
 RCC_1001 = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u0430\u0439\u043b\u0430 MIB
 RCC_1002 = \u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 MIB
 RCC_UNKNOWN = \u041e\u0448\u0438\u0431\u043a\u0430 %d
index 8988bf8..7f9850a 100644 (file)
@@ -179,6 +179,7 @@ public class LoginJob implements IRunnableWithProgress
     */
    private NXCSession createSession(String hostName, int port)
    {
+encryptSession=false;      
       // Read all registered extensions and create provider with minimal priority
       IConfigurationElement currentElement = null;
       int currentPriotity = 65536;
index 963e9d7..308552c 100644 (file)
@@ -54,9 +54,9 @@ typedef struct
 /**
  * Calculate field size
  */
-static int CalculateFieldSize(CSCP_DF *field, bool networkByteOrder)
+static size_t CalculateFieldSize(CSCP_DF *field, bool networkByteOrder)
 {
-   int nSize;
+   size_t nSize;
 
    switch(field->bType)
    {
@@ -91,17 +91,17 @@ struct MessageField
 {
    UT_hash_handle hh;
    UINT32 id;
-   UINT32 size;
+   size_t size;
    CSCP_DF data;
 };
 
 /**
  * Create new hash entry wth given field size
  */
-inline MessageField *CreateMessageField(int fieldSize)
+inline MessageField *CreateMessageField(size_t fieldSize)
 {
-   int entrySize = sizeof(MessageField) - sizeof(CSCP_DF) + fieldSize;
-   MessageField *entry = (MessageField *)malloc(entrySize);
+   size_t entrySize = sizeof(MessageField) - sizeof(CSCP_DF) + fieldSize;
+   MessageField *entry = (MessageField *)calloc(1, entrySize);
    entry->size = entrySize;
    return entry;
 }
@@ -152,22 +152,22 @@ CSCPMessage::CSCPMessage(CSCP_MESSAGE *pMsg, int version)
 
    // Parse data fields
    int fieldCount = (int)ntohl(pMsg->dwNumVars);
-   UINT32 dwSize = ntohl(pMsg->dwSize);
-   UINT32 dwPos = CSCP_HEADER_SIZE;
+   size_t dwSize = ntohl(pMsg->dwSize);
+   size_t pos = CSCP_HEADER_SIZE;
    for(int f = 0; f < fieldCount; f++)
    {
-      CSCP_DF *field = (CSCP_DF *)(((BYTE *)pMsg) + dwPos);
+      CSCP_DF *field = (CSCP_DF *)(((BYTE *)pMsg) + pos);
 
       // Validate position inside message
-      if (dwPos > dwSize - 8)
+      if (pos > dwSize - 8)
          break;
-      if ((dwPos > dwSize - 12) && 
+      if ((pos > dwSize - 12) && 
           ((field->bType == CSCP_DT_STRING) || (field->bType == CSCP_DT_BINARY)))
          break;
 
       // Calculate and validate variable size
-      int fieldSize = CalculateFieldSize(field, true);
-      if (dwPos + fieldSize > dwSize)
+      size_t fieldSize = CalculateFieldSize(field, true);
+      if (pos + fieldSize > dwSize)
          break;
 
       // Create new entry
@@ -207,9 +207,9 @@ CSCPMessage::CSCPMessage(CSCP_MESSAGE *pMsg, int version)
 
       // Starting from version 2, all variables should be 8-byte aligned
       if (m_version >= 2)
-         dwPos += fieldSize + ((8 - (fieldSize % 8)) & 7);
+         pos += fieldSize + ((8 - (fieldSize % 8)) & 7);
       else
-         dwPos += fieldSize;
+         pos += fieldSize;
    }
 }
 
@@ -835,16 +835,16 @@ BYTE *CSCPMessage::getBinaryFieldPtr(UINT32 fieldId, size_t *size)
 CSCP_MESSAGE *CSCPMessage::createMessage()
 {
    // Calculate message size
-   UINT32 dwSize = CSCP_HEADER_SIZE;
+   size_t size = CSCP_HEADER_SIZE;
    UINT32 fieldCount = 0;
    MessageField *entry, *tmp;
    HASH_ITER(hh, m_fields, entry, tmp)
    {
-      int fieldSize = CalculateFieldSize(&entry->data, false);
+      size_t fieldSize = CalculateFieldSize(&entry->data, false);
       if (m_version >= 2)
-         dwSize += fieldSize + ((8 - (fieldSize % 8)) & 7);
+         size += fieldSize + ((8 - (fieldSize % 8)) & 7);
       else
-         dwSize += fieldSize;
+         size += fieldSize;
       fieldCount++;
    }
 
@@ -852,14 +852,14 @@ CSCP_MESSAGE *CSCPMessage::createMessage()
    // This is always the case starting from version 2 because
    // all variables are padded to 8 bytes boundary
    if (m_version < 2)
-      dwSize += (8 - (dwSize % 8)) & 7;
+      size += (8 - (size % 8)) & 7;
 
    // Create message
-   CSCP_MESSAGE *pMsg = (CSCP_MESSAGE *)malloc(dwSize);
-   memset(pMsg, 0, dwSize);
+   CSCP_MESSAGE *pMsg = (CSCP_MESSAGE *)malloc(size);
+   memset(pMsg, 0, size);
    pMsg->wCode = htons(m_code);
    pMsg->wFlags = htons(m_flags);
-   pMsg->dwSize = htonl(dwSize);
+   pMsg->dwSize = htonl((UINT32)size);
    pMsg->dwId = htonl(m_id);
    pMsg->dwNumVars = htonl(fieldCount);
 
@@ -867,7 +867,7 @@ CSCP_MESSAGE *CSCPMessage::createMessage()
    CSCP_DF *field = (CSCP_DF *)((char *)pMsg + CSCP_HEADER_SIZE);
    HASH_ITER(hh, m_fields, entry, tmp)
    {
-      int fieldSize = CalculateFieldSize(&entry->data, false);
+      size_t fieldSize = CalculateFieldSize(&entry->data, false);
       memcpy(field, &entry->data, fieldSize);
 
       // Convert numeric values to network format
@@ -1167,7 +1167,7 @@ String CSCPMessage::dump(CSCP_MESSAGE *pMsg, int version)
    }
    
    // Parse data fields
-   UINT32 pos = CSCP_HEADER_SIZE;
+   size_t pos = CSCP_HEADER_SIZE;
    for(int f = 0; f < numFields; f++)
    {
       CSCP_DF *field = (CSCP_DF *)(((BYTE *)pMsg) + pos);
@@ -1186,7 +1186,7 @@ String CSCPMessage::dump(CSCP_MESSAGE *pMsg, int version)
       }
 
       // Calculate and validate field size
-      int fieldSize = CalculateFieldSize(field, TRUE);
+      size_t fieldSize = CalculateFieldSize(field, TRUE);
       if (pos + fieldSize > size)
       {
          out += _T("  ** message format error (invalid field size)\n");
index 20eb4b1..52bc4bf 100644 (file)
@@ -392,9 +392,11 @@ const TCHAR LIBNXCL_EXPORTABLE *NXCGetErrorText(UINT32 dwError)
       _T("Routing table unavailable"),
       _T("Switch forwarding database unavailable"),
       _T("Location history not available"),
-      _T("Object is in use and cannot be deleted")
+      _T("Object is in use and cannot be deleted"),
+      _T("Script compilation error"),
+      _T("Script execution error")
    };
-       return (dwError <= RCC_OBJECT_IN_USE) ? pszErrorText[dwError] : _T("No text message for this error");
+       return (dwError <= RCC_NXSL_EXECUTION_ERROR) ? pszErrorText[dwError] : _T("No text message for this error");
 }
 
 #if defined(_WIN32) && !defined(UNDER_CE)
index e164e7c..3c88d10 100644 (file)
@@ -1388,8 +1388,8 @@ void NXSL_ClientSessionEnv::trace(int level, const TCHAR *text)
       size_t len = _tcslen(text);
       TCHAR *t = (TCHAR *)malloc((len + 2) * sizeof(TCHAR));
       memcpy(t, text, len * sizeof(TCHAR));
-      t[len - 1] = _T('\n');
-      t[len] = 0;
+      t[len] = _T('\n');
+      t[len + 1] = 0;
                m_response->SetVariable(VID_MESSAGE, t);
                m_session->sendMessage(m_response);
       free(t);
index 17cb224..0b83743 100644 (file)
@@ -10975,22 +10975,18 @@ void ClientSession::testDCITransformation(CSCPMessage *pRequest)
 /**
  * Execute script in object's context
  */
-void ClientSession::executeScript(CSCPMessage *pRequest)
+void ClientSession::executeScript(CSCPMessage *request)
 {
-   CSCPMessage msg, updateMessage;
+   CSCPMessage msg;
    bool success = false;
    NXSL_VM *vm = NULL;
-   TCHAR result[256];
 
    // Prepare response message
    msg.SetCode(CMD_REQUEST_COMPLETED);
-   msg.SetId(pRequest->GetId());
-   //Prepare update message
-   updateMessage.SetCode(CMD_EXECUTE_SCRIPT_UPDATE);
-   updateMessage.SetId(pRequest->GetId());
+   msg.SetId(request->GetId());
 
    // Get node id and check object class and access rights
-   NetObj *object = FindObjectById(pRequest->GetVariableLong(VID_OBJECT_ID));
+   NetObj *object = FindObjectById(request->GetVariableLong(VID_OBJECT_ID));
    if (object != NULL)
    {
       if ((object->getObjectClass() == OBJECT_NODE) ||
@@ -11002,10 +10998,11 @@ void ClientSession::executeScript(CSCPMessage *pRequest)
       {
          if (object->checkAccessRights(m_dwUserId, OBJECT_ACCESS_MODIFY))
          {
-                               TCHAR *script = pRequest->GetVariableStr(VID_SCRIPT);
+                               TCHAR *script = request->GetVariableStr(VID_SCRIPT);
                                if (script != NULL)
                                {
-               vm = NXSLCompileAndCreateVM(script, result, 256, new NXSL_ClientSessionEnv(this, &updateMessage));
+               TCHAR errorMessage[256];
+               vm = NXSLCompileAndCreateVM(script, errorMessage, 256, new NXSL_ClientSessionEnv(this, &msg));
                if (vm != NULL)
                {
                   vm->setGlobalVariable(_T("$object"), new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, object)));
@@ -11014,12 +11011,14 @@ void ClientSession::executeScript(CSCPMessage *pRequest)
                      vm->setGlobalVariable(_T("$node"), new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, object)));
                   }
                   msg.SetVariable(VID_RCC, RCC_SUCCESS);
-                  msg.SetVariable(VID_EXECUTION_RESULT, result);
                   sendMessage(&msg);
                   success = true;
                }
-               msg.SetVariable(VID_EXECUTION_RESULT, result);
-               msg.SetVariable(VID_RCC, RCC_COMM_FAILURE); //TODO: return correct errot(Compilation error)
+               else
+               {
+                  msg.SetVariable(VID_RCC, RCC_NXSL_COMPILATION_ERROR);
+                  msg.SetVariable(VID_ERROR_TEXT, errorMessage);
+               }
                                        safe_free(script);
                                }
                                else
@@ -11045,23 +11044,23 @@ void ClientSession::executeScript(CSCPMessage *pRequest)
    // start execution
    if (success)
    {
+      msg.SetCode(CMD_EXECUTE_SCRIPT_UPDATE);
       if (vm->run())
       {
          TCHAR buffer[1024];
          const TCHAR *value = vm->getResult()->getValueAsCString();
          _sntprintf(buffer, 1024, _T("\n\n*** FINISHED ***\n\nResult: %s\n\n"), CHECK_NULL(value));
-         updateMessage.SetVariable(VID_MESSAGE, buffer);
-                       updateMessage.SetVariable(VID_RCC, RCC_SUCCESS);
-         updateMessage.setEndOfSequence();
-         sendMessage(&updateMessage);
+         msg.SetVariable(VID_MESSAGE, buffer);
+                       msg.SetVariable(VID_RCC, RCC_SUCCESS);
+         msg.setEndOfSequence();
+         sendMessage(&msg);
       }
       else
       {
-         nx_strncpy(result, vm->getErrorText(), 256);
-         updateMessage.SetVariable(VID_MESSAGE, result);
-                       updateMessage.SetVariable(VID_RCC, RCC_EXEC_FAILED);
-         updateMessage.setEndOfSequence();
-         sendMessage(&updateMessage);
+         msg.SetVariable(VID_ERROR_TEXT, vm->getErrorText());
+                       msg.SetVariable(VID_RCC, RCC_NXSL_EXECUTION_ERROR);
+         msg.setEndOfSequence();
+         sendMessage(&msg);
       }
       delete vm;
    }
@@ -11089,39 +11088,39 @@ void ClientSession::sendJobList(UINT32 dwRqId)
 /**
  * Cancel server job
  */
-void ClientSession::cancelJob(CSCPMessage *pRequest)
+void ClientSession::cancelJob(CSCPMessage *request)
 {
        CSCPMessage msg;
 
        msg.SetCode(CMD_REQUEST_COMPLETED);
-       msg.SetId(pRequest->GetId());
-       msg.SetVariable(VID_RCC, ::CancelJob(m_dwUserId, pRequest));
+       msg.SetId(request->GetId());
+       msg.SetVariable(VID_RCC, ::CancelJob(m_dwUserId, request));
        sendMessage(&msg);
 }
 
 /**
  * Put server job on hold
  */
-void ClientSession::holdJob(CSCPMessage *pRequest)
+void ClientSession::holdJob(CSCPMessage *request)
 {
        CSCPMessage msg;
 
        msg.SetCode(CMD_REQUEST_COMPLETED);
-       msg.SetId(pRequest->GetId());
-       msg.SetVariable(VID_RCC, ::HoldJob(m_dwUserId, pRequest));
+       msg.SetId(request->GetId());
+       msg.SetVariable(VID_RCC, ::HoldJob(m_dwUserId, request));
        sendMessage(&msg);
 }
 
 /**
  * Allow server job on hold for execution
  */
-void ClientSession::unholdJob(CSCPMessage *pRequest)
+void ClientSession::unholdJob(CSCPMessage *request)
 {
        CSCPMessage msg;
 
        msg.SetCode(CMD_REQUEST_COMPLETED);
-       msg.SetId(pRequest->GetId());
-       msg.SetVariable(VID_RCC, ::UnholdJob(m_dwUserId, pRequest));
+       msg.SetId(request->GetId());
+       msg.SetVariable(VID_RCC, ::UnholdJob(m_dwUserId, request));
        sendMessage(&msg);
 }