fixed memory leaks
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 22 Jan 2014 18:33:45 +0000 (20:33 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 22 Jan 2014 18:33:45 +0000 (20:33 +0200)
include/strophe.h
src/libnetxms/config.cpp
src/libstrophe/stanza.c
src/server/core/graph.cpp
src/server/core/session.cpp
src/server/core/xmpp.cpp
src/server/include/nms_core.h

index f71ba0f..60adca2 100644 (file)
@@ -329,7 +329,7 @@ char LIBSTROPHE_EXPORTABLE *xmpp_stanza_get_text(xmpp_stanza_t * const stanza);
 char LIBSTROPHE_EXPORTABLE *xmpp_stanza_get_text_ptr(xmpp_stanza_t * const stanza);
 char LIBSTROPHE_EXPORTABLE *xmpp_stanza_get_name(xmpp_stanza_t * const stanza);
 
 char LIBSTROPHE_EXPORTABLE *xmpp_stanza_get_text_ptr(xmpp_stanza_t * const stanza);
 char LIBSTROPHE_EXPORTABLE *xmpp_stanza_get_name(xmpp_stanza_t * const stanza);
 
-int LIBSTROPHE_EXPORTABLE xmpp_stanza_add_child(xmpp_stanza_t *stanza, xmpp_stanza_t *child);
+int LIBSTROPHE_EXPORTABLE xmpp_stanza_add_child(xmpp_stanza_t *stanza, xmpp_stanza_t *child, int do_clone);
 int LIBSTROPHE_EXPORTABLE xmpp_stanza_set_ns(xmpp_stanza_t * const stanza, const char * const ns);
 /* set_attribute adds/replaces attributes */
 int LIBSTROPHE_EXPORTABLE xmpp_stanza_set_attribute(xmpp_stanza_t * const stanza, 
 int LIBSTROPHE_EXPORTABLE xmpp_stanza_set_ns(xmpp_stanza_t * const stanza, const char * const ns);
 /* set_attribute adds/replaces attributes */
 int LIBSTROPHE_EXPORTABLE xmpp_stanza_set_attribute(xmpp_stanza_t * const stanza, 
index 54e1642..201c604 100644 (file)
@@ -943,7 +943,10 @@ static void StartElement(void *userData, const char *name, const char **attrs)
    {
       if (!stricmp(name, ps->topLevelTag))
       {
    {
       if (!stricmp(name, ps->topLevelTag))
       {
-         ps->stack[ps->level++] = ps->config->getEntry(_T("/"));
+         ps->stack[ps->level] = ps->config->getEntry(_T("/"));
+         ps->charData[ps->level] = _T("");
+         ps->trimValue[ps->level] = XMLGetAttrBoolean(attrs, "trim", true);
+         ps->level++;
       }
       else
       {
       }
       else
       {
@@ -1001,7 +1004,7 @@ static void StartElement(void *userData, const char *name, const char **attrs)
  */
 static void EndElement(void *userData, const char *name)
 {
  */
 static void EndElement(void *userData, const char *name)
 {
-   XML_PARSER_STATE *ps = (XML_PARSER_STATE *) userData;
+   XML_PARSER_STATE *ps = (XML_PARSER_STATE *)userData;
 
    if (ps->level > MAX_STACK_DEPTH)
    {
 
    if (ps->level > MAX_STACK_DEPTH)
    {
index 28685e7..36a8120 100644 (file)
@@ -154,28 +154,33 @@ copy_error:
  */
 int xmpp_stanza_release(xmpp_stanza_t * const stanza)
 {
  */
 int xmpp_stanza_release(xmpp_stanza_t * const stanza)
 {
-    int released = 0;
-    xmpp_stanza_t *child, *tchild;
-
-    /* release stanza */
-    if (stanza->ref > 1)
-       stanza->ref--;
-    else {
-       /* release all children */
-       child = stanza->children;
-       while (child) {
-           tchild = child;
-           child = child->next;
-           xmpp_stanza_release(tchild);
-       }
-
-       if (stanza->attributes) hash_release(stanza->attributes);
-       if (stanza->data) xmpp_free(stanza->ctx, stanza->data);
-       xmpp_free(stanza->ctx, stanza);
-       released = 1;
-    }
-
-    return released;
+   int released = 0;
+   xmpp_stanza_t *child, *tchild;
+
+   /* release stanza */
+   if (stanza->ref > 1)
+   {
+      stanza->ref--;
+   }
+   else 
+   {
+      /* release all children */
+      child = stanza->children;
+      while (child) 
+      {
+         tchild = child;
+         child = child->next;
+         xmpp_stanza_release(tchild);
+      }
+
+      if (stanza->attributes) 
+         hash_release(stanza->attributes);
+      if (stanza->data) 
+         xmpp_free(stanza->ctx, stanza->data);
+      xmpp_free(stanza->ctx, stanza);
+      released = 1;
+   }
+   return released;
 }
 
 /** Determine if a stanza is a text node.
 }
 
 /** Determine if a stanza is a text node.
@@ -565,8 +570,7 @@ int xmpp_stanza_set_attribute(xmpp_stanza_t * const stanza,
  *
  *  @ingroup Stanza
  */
  *
  *  @ingroup Stanza
  */
-int xmpp_stanza_set_ns(xmpp_stanza_t * const stanza,
-                      const char * const ns)
+int xmpp_stanza_set_ns(xmpp_stanza_t * const stanza, const char * const ns)
 {
     return xmpp_stanza_set_attribute(stanza, "xmlns", ns);
 }
 {
     return xmpp_stanza_set_attribute(stanza, "xmlns", ns);
 }
@@ -582,12 +586,13 @@ int xmpp_stanza_set_ns(xmpp_stanza_t * const stanza,
  *
  *  @ingroup Stanza
  */
  *
  *  @ingroup Stanza
  */
-int xmpp_stanza_add_child(xmpp_stanza_t *stanza, xmpp_stanza_t *child)
+int xmpp_stanza_add_child(xmpp_stanza_t *stanza, xmpp_stanza_t *child, int do_clone)
 {
     xmpp_stanza_t *s;
 
     /* get a reference to the child */
 {
     xmpp_stanza_t *s;
 
     /* get a reference to the child */
-    xmpp_stanza_clone(child);
+    if (do_clone)
+      xmpp_stanza_clone(child);
 
     child->parent = stanza;
 
 
     child->parent = stanza;
 
index 2a5d5ea..9389327 100644 (file)
@@ -90,7 +90,7 @@ BOOL CheckGraphAccess(GRAPH_ACL_ENTRY *pACL, int nACLSize, UINT32 graphId, UINT3
 /**
  * Check access to the graph
  */
 /**
  * Check access to the graph
  */
-int GetGraphAccessCheckResult(UINT32 graphId, UINT32 graphUserId)
+UINT32 GetGraphAccessCheckResult(UINT32 graphId, UINT32 graphUserId)
 {
    // Check existence and access rights
    TCHAR szQuery[16384];
 {
    // Check existence and access rights
    TCHAR szQuery[16384];
@@ -98,6 +98,7 @@ int GetGraphAccessCheckResult(UINT32 graphId, UINT32 graphUserId)
    UINT32 dwOwner;
    GRAPH_ACL_ENTRY *pACL = NULL;
    int nACLSize;
    UINT32 dwOwner;
    GRAPH_ACL_ENTRY *pACL = NULL;
    int nACLSize;
+   UINT32 rcc = RCC_DB_FAILURE;
 
    _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("SELECT owner_id FROM graphs WHERE graph_id=%d"), graphId);
    hResult = DBSelect(g_hCoreDB, szQuery);
 
    _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("SELECT owner_id FROM graphs WHERE graph_id=%d"), graphId);
    hResult = DBSelect(g_hCoreDB, szQuery);
@@ -113,29 +114,26 @@ int GetGraphAccessCheckResult(UINT32 graphId, UINT32 graphUserId)
                 (graphUserId == dwOwner) ||
                 CheckGraphAccess(pACL, nACLSize, graphId, graphUserId, NXGRAPH_ACCESS_WRITE))
             {
                 (graphUserId == dwOwner) ||
                 CheckGraphAccess(pACL, nACLSize, graphId, graphUserId, NXGRAPH_ACCESS_WRITE))
             {
-               return RCC_SUCCESS;
+               rcc = RCC_SUCCESS;
             }
             else
             {
             }
             else
             {
-               return RCC_ACCESS_DENIED;
+               rcc = RCC_ACCESS_DENIED;
             }
             safe_free(pACL);
          }
          else
          {
             }
             safe_free(pACL);
          }
          else
          {
-            return RCC_DB_FAILURE;
+            rcc = RCC_DB_FAILURE;
          }
       }
       else
       {
          }
       }
       else
       {
-         return RCC_INVALID_GRAPH_ID;
+         rcc = RCC_INVALID_GRAPH_ID;
       }
       DBFreeResult(hResult);
    }
       }
       DBFreeResult(hResult);
    }
-   else
-   {
-      return RCC_DB_FAILURE;
-   }
+   return rcc;
 };
 
 /**
 };
 
 /**
index 32bb5a4..543044b 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 NetXMS Team
+** Copyright (C) 2003-2014 Raden Solutions
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -9212,18 +9212,17 @@ void ClientSession::SendGraphList(UINT32 dwRqId)
    sendMessage(&msg);
 }
 
    sendMessage(&msg);
 }
 
-//
-// Save graph
-//
-
+/**
+ * Save graph
+ */
 void ClientSession::SaveGraph(CSCPMessage *pRequest)
 {
    CSCPMessage msg;
        BOOL bNew, bSuccess;
 void ClientSession::SaveGraph(CSCPMessage *pRequest)
 {
    CSCPMessage msg;
        BOOL bNew, bSuccess;
-       UINT32 id, graphId, graphUserId, graphAccess;
+       UINT32 id, graphId, graphUserId, graphAccess, accessRightStatus;
        UINT16 overwrite;
        TCHAR szQuery[16384], *pszEscName, *pszEscData, *pszTemp, dwGraphName[255];
        UINT16 overwrite;
        TCHAR szQuery[16384], *pszEscName, *pszEscData, *pszTemp, dwGraphName[255];
-       int i, nACLSize, accessRightStatus;
+       int i, nACLSize;
 
    msg.SetCode(CMD_REQUEST_COMPLETED);
    msg.SetId(pRequest->GetId());
 
    msg.SetCode(CMD_REQUEST_COMPLETED);
    msg.SetId(pRequest->GetId());
@@ -9234,7 +9233,7 @@ void ClientSession::SaveGraph(CSCPMessage *pRequest)
 
    GRAPH_ACL_AND_ID nameUniq = IsGraphNameExists(dwGraphName);
 
 
    GRAPH_ACL_AND_ID nameUniq = IsGraphNameExists(dwGraphName);
 
-   if(nameUniq.graphId == graphId)
+   if (nameUniq.graphId == graphId)
    {
       nameUniq.status = RCC_SUCCESS;
    }
    {
       nameUniq.status = RCC_SUCCESS;
    }
@@ -9251,10 +9250,10 @@ void ClientSession::SaveGraph(CSCPMessage *pRequest)
                bNew = FALSE;
        }
 
                bNew = FALSE;
        }
 
-   if( accessRightStatus == RCC_SUCCESS && ( nameUniq.status == RCC_SUCCESS || (overwrite && bNew) ) )
+   if (accessRightStatus == RCC_SUCCESS && (nameUniq.status == RCC_SUCCESS || (overwrite && bNew)))
    {
       bSuccess = TRUE;
    {
       bSuccess = TRUE;
-      if(nameUniq.status != RCC_SUCCESS )
+      if (nameUniq.status != RCC_SUCCESS)
       {
          bNew = FALSE;
          graphId = nameUniq.graphId;
       {
          bNew = FALSE;
          graphId = nameUniq.graphId;
index 4587222..740de19 100644 (file)
@@ -77,21 +77,21 @@ static int VersionHandler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza
 
    xmpp_stanza_t *name = xmpp_stanza_new(ctx);
    xmpp_stanza_set_name(name, "name");
 
    xmpp_stanza_t *name = xmpp_stanza_new(ctx);
    xmpp_stanza_set_name(name, "name");
-   xmpp_stanza_add_child(query, name);
+   xmpp_stanza_add_child(query, name, FALSE);
 
    xmpp_stanza_t *text = xmpp_stanza_new(ctx);
    xmpp_stanza_set_text(text, "NetXMS Server");
 
    xmpp_stanza_t *text = xmpp_stanza_new(ctx);
    xmpp_stanza_set_text(text, "NetXMS Server");
-   xmpp_stanza_add_child(name, text);
+   xmpp_stanza_add_child(name, text, FALSE);
 
    xmpp_stanza_t *version = xmpp_stanza_new(ctx);
    xmpp_stanza_set_name(version, "version");
 
    xmpp_stanza_t *version = xmpp_stanza_new(ctx);
    xmpp_stanza_set_name(version, "version");
-   xmpp_stanza_add_child(query, version);
+   xmpp_stanza_add_child(query, version, FALSE);
 
    text = xmpp_stanza_new(ctx);
    xmpp_stanza_set_text(text, NETXMS_VERSION_STRING_A);
 
    text = xmpp_stanza_new(ctx);
    xmpp_stanza_set_text(text, NETXMS_VERSION_STRING_A);
-   xmpp_stanza_add_child(version, text);
+   xmpp_stanza_add_child(version, text, FALSE);
 
 
-   xmpp_stanza_add_child(reply, query);
+   xmpp_stanza_add_child(reply, query, FALSE);
 
    xmpp_send(conn, reply);
    xmpp_stanza_release(reply);
 
    xmpp_send(conn, reply);
    xmpp_stanza_release(reply);
@@ -181,8 +181,8 @@ static int MessageHandler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza
          char *response = console.output->getUTF8String();
              xmpp_stanza_set_text(text, response);
          free(response);
          char *response = console.output->getUTF8String();
              xmpp_stanza_set_text(text, response);
          free(response);
-             xmpp_stanza_add_child(body, text);
-             xmpp_stanza_add_child(reply, body);
+             xmpp_stanza_add_child(body, text, FALSE);
+             xmpp_stanza_add_child(reply, body, FALSE);
        
              xmpp_send(conn, reply);
              xmpp_stanza_release(reply);
        
              xmpp_send(conn, reply);
              xmpp_stanza_release(reply);
@@ -325,8 +325,8 @@ bool SendXMPPMessage(const TCHAR *rcpt, const TCHAR *message)
        
        xmpp_stanza_t *text = xmpp_stanza_new(s_xmppContext);
        xmpp_stanza_set_text(text, _message);
        
        xmpp_stanza_t *text = xmpp_stanza_new(s_xmppContext);
        xmpp_stanza_set_text(text, _message);
-       xmpp_stanza_add_child(body, text);
-       xmpp_stanza_add_child(msg, body);
+       xmpp_stanza_add_child(body, text, FALSE);
+       xmpp_stanza_add_child(msg, body, FALSE);
        
        xmpp_send(s_xmppConnection, msg);
        xmpp_stanza_release(msg);
        
        xmpp_send(s_xmppConnection, msg);
        xmpp_stanza_release(msg);
index 7f7d8e5..2db7cde 100644 (file)
@@ -919,7 +919,7 @@ void DumpProcess(CONSOLE_CTX pCtx);
 
 GRAPH_ACL_ENTRY *LoadGraphACL(UINT32 graphId, int *pnACLSize);
 BOOL CheckGraphAccess(GRAPH_ACL_ENTRY *pACL, int nACLSize, UINT32 graphId, UINT32 graphUserId, UINT32 graphDesiredAccess);
 
 GRAPH_ACL_ENTRY *LoadGraphACL(UINT32 graphId, int *pnACLSize);
 BOOL CheckGraphAccess(GRAPH_ACL_ENTRY *pACL, int nACLSize, UINT32 graphId, UINT32 graphUserId, UINT32 graphDesiredAccess);
-int GetGraphAccessCheckResult(UINT32 graphId, UINT32 graphUserId);
+UINT32 GetGraphAccessCheckResult(UINT32 graphId, UINT32 graphUserId);
 GRAPH_ACL_AND_ID IsGraphNameExists(const TCHAR *graphName);
 
 #if XMPP_SUPPORTED
 GRAPH_ACL_AND_ID IsGraphNameExists(const TCHAR *graphName);
 
 #if XMPP_SUPPORTED