novi upstream verzije 2.8.3
[ossec-hids.git] / src / os_xml / os_xml_node_access.c
index 7d986ca..619eec9 100755 (executable)
@@ -1,11 +1,12 @@
-/* @(#) $Id: os_xml_node_access.c,v 1.6 2009/06/24 17:06:32 dcid Exp $ */
+/* @(#) $Id: ./src/os_xml/os_xml_node_access.c, 2011/09/08 dcid Exp $
+ */
 
 /* Copyright (C) 2009 Trend Micro Inc.
  * All rights reserved.
  *
  * This program is a free software; you can redistribute it
  * and/or modify it under the terms of the GNU General Public
- * License (version 3) as published by the FSF - Free Software
+ * License (version 2) as published by the FSF - Free Software
  * Foundation
  */
 
 #include <stdlib.h>
 
 #include "os_xml.h"
+#include "os_xml_internal.h"
 
 
 /* OS_ClearNode v0,1
- * Clear the Node structure 
+ * Clear the Node structure
  */
 void OS_ClearNode(xml_node **node)
 {
     if(node)
-    {   
+    {
         int i=0;
         while(node[i])
         {
             if(node[i]->element)
+            {
                 free(node[i]->element);
+            }
             if(node[i]->content)
+            {
                 free(node[i]->content);
+            }
             if(node[i]->attributes)
             {
                 int j=0;
@@ -62,10 +68,9 @@ void OS_ClearNode(xml_node **node)
             node[i]->values=NULL;
             free(node[i]);
             node[i]=NULL;
-            i++;    
+            i++;
         }
         free(node);
-        node=NULL;
     }
 }
 
@@ -73,59 +78,61 @@ void OS_ClearNode(xml_node **node)
 /** xml_node **OS_GetElementsbyNode(OS_XML *_lxml, xml_node *node)
  * Get the elements by node.
  */
-xml_node **OS_GetElementsbyNode(OS_XML *_lxml, xml_node *node)
+xml_node **OS_GetElementsbyNode(const OS_XML *_lxml, const xml_node *node)
 {
-    int i,j,k=0;
+    unsigned int i, k =0,m;
     xml_node **ret=NULL;
+    xml_node **ret_tmp=NULL;
 
     if(node == NULL)
     {
-        j = -1;
+        m = 0;
         i = 0;
     }
     else
     {
         i = node->key;
-        j = _lxml->rl[i++];
+        m = _lxml->rl[i++] + 1;
     }
-        
-            
+
+
     for(;i<_lxml->cur;i++)
     {
         if(_lxml->tp[i] == XML_ELEM)
         {
-            if((_lxml->rl[i] == j+1) && (_lxml->el[i] != NULL))
+            if((_lxml->rl[i] == m) && (_lxml->el[i] != NULL))
             {
-                int l=i+1;
+                unsigned int l=i+1;
                 /* Allocating for xml_node ** */
-                ret = (xml_node**)realloc(ret,(k+1)*sizeof(xml_node*));
-                if(ret == NULL)
-                    return(NULL);
-                    
+                ret_tmp = (xml_node**)realloc(ret,(k+2)*sizeof(xml_node*));
+                if(ret_tmp == NULL)
+                    goto fail;
+                ret = ret_tmp;
+
                 /* Allocating for the xml_node * */
                 ret[k] = (xml_node *)calloc(1,sizeof(xml_node));
+                ret[k+1] = NULL;
                 if(ret[k] == NULL)
-                    return(NULL);
-    
+                    goto fail;
+
                 ret[k]->element = NULL;
                 ret[k]->content = NULL;
                 ret[k]->attributes = NULL;
                 ret[k]->values = NULL;
-                                
+
                 /* Getting the element */
                 ret[k]->element=strdup(_lxml->el[i]);
                 if(ret[k]->element == NULL)
                 {
-                    free(ret);
-                    return(NULL);
+                    goto fail;
                 }
-                
+
                 /* Getting the content */
                 if(_lxml->ct[i])
                 {
                     ret[k]->content=strdup(_lxml->ct[i]);
                     if(ret[k]->content == NULL)
-                        return(NULL);
+                        goto fail;
                 }
                 /* Assigning the key */
                 ret[k]->key = i;
@@ -133,56 +140,51 @@ xml_node **OS_GetElementsbyNode(OS_XML *_lxml, xml_node *node)
                 /* Getting attributes */
                 while(l < _lxml->cur)
                 {
-                    if((_lxml->tp[l] == XML_ATTR)&&(_lxml->rl[l] == j+1)&&
+                    if((_lxml->tp[l] == XML_ATTR)&&(_lxml->rl[l] == m)&&
                         (_lxml->el[l]) && (_lxml->ct[l]))
                         {
-                            ret[k]->attributes = 
-                                (char**)realloc(ret[k]->attributes,
-                                                (l-i+1)*sizeof(char*));
-                            ret[k]->values = 
-                                (char**)realloc(ret[k]->values,
-                                                (l-i+1)*sizeof(char*));
-                            if(!(ret[k]->attributes) || 
-                                    !(ret[k]->values))
-                                return(NULL);
+                               char **tmp;
+                               tmp = (char**)realloc(ret[k]->attributes, (l-i+1)*sizeof(char*));
+                               if(tmp == NULL)
+                                       goto fail;
+                               ret[k]->attributes = tmp;
+                               ret[k]->attributes[l-i] = NULL;
+                               tmp = (char**)realloc(ret[k]->values, (l-i+1)*sizeof(char*));
+                               if(tmp == NULL)
+                                       goto fail;
+                            ret[k]->values = tmp;
+                            ret[k]->values[l-i] = NULL;
+
                             ret[k]->attributes[l-i-1]=strdup(_lxml->el[l]);
                             ret[k]->values[l-i-1] = strdup(_lxml->ct[l]);
                             if(!(ret[k]->attributes[l-i-1]) ||
                                     !(ret[k]->values[l-i-1]))
-                                return(NULL);
-                            l++;                    
+                                goto fail;
+                            l++;
                         }
                     else
                     {
                         break;
                     }
                 }
-                if(ret[k]->attributes)
-                {
-                    ret[k]->attributes[l-i-1] = NULL;
-                    ret[k]->values[l-i-1] = NULL;
-                }
                 k++;
                 continue;
             }
         }
-        if((_lxml->tp[i] == XML_ELEM)&&(j+1 > _lxml->rl[i]))
+        if((_lxml->tp[i] == XML_ELEM)&&(m > _lxml->rl[i]))
         {
-            if(j == -1)
+            if(node == NULL)
                 continue;
             else
                 break;
         }
     }
-    
-    if(ret ==NULL)
-        return(NULL);
-
-    ret = (xml_node **)realloc(ret,(k+1)*sizeof(xml_node *));
-    if(ret == NULL)
-        return(NULL);
-    ret[k]=NULL;
+
     return(ret);
+
+    fail:
+    OS_ClearNode(ret);
+       return (NULL);
 }