new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / os_xml / os_xml_variables.c
old mode 100755 (executable)
new mode 100644 (file)
index e474cda..efbbaf9
-/*   $OSSEC, os_xml_node_variables.c, v0.3, 2005/04/12, Daniel B. Cid$   */
-
 /* 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
  */
 
-/* os_xml C Library.
- * Available at http://www.ossec.net/
- */
-
-
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 #include "os_xml.h"
+#include "os_xml_internal.h"
+
 
 int OS_ApplyVariables(OS_XML *_lxml)
 {
-    int i = 0,j = 0,s = 0;
+    unsigned int i, j = 0, s = 0;
+    int retval = 0;
     char **var = NULL;
     char **value = NULL;
+    char **tmp = NULL;
+    char *p2 = NULL;
+    char *var_placeh = NULL;
 
+    /* Get all variables */
+    for (i = 0; i < _lxml->cur; i++) {
+        if (_lxml->tp[i] == XML_VARIABLE_BEGIN) {
+            int _found_var = 0;
 
-    /* No variables. */
-    if(!_lxml->cur)
-        return(0);
+            for (j = i + 1; j < _lxml->cur; j++) {
+                if (_lxml->rl[j] < _lxml->rl[i]) {
+                    break;
+                }
 
+                else if (_lxml->tp[j] == XML_ATTR) {
+                    if ((_lxml->el[j]) && (strcasecmp(_lxml->el[j], XML_VAR_ATTRIBUTE) == 0)) {
+                        if (!_lxml->ct[j]) {
+                            snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Invalid variable content.");
+                            _lxml->err_line = _lxml->ln[j];
+                            goto fail;
+                        } else if (strlen(_lxml->ct[j]) >= XML_VARIABLE_MAXSIZE) {
+                            snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Invalid variable name size.");
+                            _lxml->err_line = _lxml->ln[j];
+                            goto fail;
+                        }
 
-    /* Getting all variables */
-    for(;i<_lxml->cur;i++)
-    {
-        if(_lxml->tp[i] == XML_VARIABLE_BEGIN)
-        {
-            int _found_var = 0;
+                        /* If not used, it will be cleaned later */
+                        snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error.");
 
-            j = i+1;
-            for(;j<_lxml->cur;j++)
-            {
-                if(_lxml->rl[j] < _lxml->rl[i])
-                    break;
+                        tmp = (char **)realloc(var, (s + 1) * sizeof(char *));
+                        if (tmp == NULL) {
+                            goto fail;
+                        }
+                        var = tmp;
+
+                        var[s] = _lxml->ct[j];
 
-                else if(_lxml->tp[j] == XML_ATTR)
-                {
-                    if((_lxml->el[j])&&(strcasecmp(_lxml->el[j],"name") == 0))
-                    {
-                        if(!_lxml->ct[j])
-                            break;
-                
-                        /* If not used, it will be cleaned latter */        
-                        snprintf(_lxml->err, 128, "XML_ERR: Memory error");
-                            
-                        var = (char**)realloc(var,(s+1)*sizeof(char *));
-                        if(var == NULL)
-                            return (-1);
-                        
-                        var[s] = strdup(_lxml->ct[j]);
-                        if(var[s] == NULL)
-                            return(-1);
-                       
-                        /* Cleaning the lxml->err */ 
-                        strncpy(_lxml->err," ", 3);
+                        /* Clean the lxml->err */
+                        strncpy(_lxml->err, " ", 3);
 
                         _found_var = 1;
                         break;
-                    }
-                    else
-                    {
-                        snprintf(_lxml->err, 128, 
-                                 "XML_ERR: Only \"name\" is allowed"
-                                 " as an attribute for a variable");
-                        return(-1);
+                    } else {
+                        snprintf(_lxml->err, XML_ERR_LENGTH,
+                                 "XMLERR: Only \""XML_VAR_ATTRIBUTE"\" is allowed"
+                                 " as an attribute for a variable.");
+                        _lxml->err_line = _lxml->ln[j];
+                        goto fail;
                     }
                 }
             } /* Attribute FOR */
-            
-            
-            if((_found_var == 0)||(!_lxml->ct[i]))
-            {
-                snprintf(_lxml->err,128, 
-                         "XML_ERR: Bad formed variable. No value set");
-                return(-1);
+
+
+            if ((_found_var == 0) || (!_lxml->ct[i])) {
+                snprintf(_lxml->err, XML_ERR_LENGTH,
+                         "XMLERR: No value set for variable.");
+                _lxml->err_line = _lxml->ln[i];
+                goto fail;
             }
-            
-            
-            snprintf(_lxml->err,128, "XML_ERR: Memory error");
-        
-            value = (char**)realloc(value,(s+1)*sizeof(char *));
-            if (value == NULL)
-                return(-1);
-        
-            value[s] = strdup(_lxml->ct[i]);
-            if(value[s] == NULL)
-                return(-1);    
-        
-            strncpy(_lxml->err," ", 3);
+
+            snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error.");
+
+            tmp = (char **)realloc(value, (s + 1) * sizeof(char *));
+            if (tmp == NULL) {
+                goto fail;
+            }
+            value = tmp;
+
+            value[s] = _lxml->ct[i];
+
+            strncpy(_lxml->err, " ", 3);
             s++;
-        }
-    } /* initial FOR to get the variables  */
-  
-  
-    /* No variable */
-    if(s == 0)
-        return(0);
-
-
-    /* Looping again and modifying where found the variables */
-    i = 0; 
-    for(;i<_lxml->cur;i++)
-    {
-        if(((_lxml->tp[i] == XML_ELEM) || (_lxml->tp[i] == XML_ATTR))&&
-            (_lxml->ct[i]))
-        {
-            int tp = 0,init = 0,final = 0;
+        } else if (((_lxml->tp[i] == XML_ELEM) || (_lxml->tp[i] == XML_ATTR)) &&
+                   (_lxml->ct[i])) {
+            unsigned int tp = 0;
+            size_t init = 0;
             char *p = NULL;
-            char *p2= NULL;
-            char lvar[256]; /* MAX Var size */
-          
-            
-            if(strlen(_lxml->ct[i]) <= 2)
+            char lvar[XML_VARIABLE_MAXSIZE]; /* MAX Var size */
+
+
+            if (strlen(_lxml->ct[i]) <= 2) {
                 continue;
-            
-            
-            /* Duplicating string */     
+            }
+
+            /* Check if any variable is defined */
+            if (s == 0) {
+                continue;
+            }
+
+            /* Duplicate string */
             p = strdup(_lxml->ct[i]);
-            p2= p;
-            
-            if(p == NULL)
-            {
-                snprintf(_lxml->err, 128, "XML_ERR: Memory error");
-                return(-1);
+            p2 = p;
+
+            if (p == NULL) {
+                snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error.");
+                goto fail;
             }
-            
-            
-            /* Reading the whole string */
-            while(*p != '\0')
-            {
-                if(*p == XML_VARIABLE_BEGIN)
-                {
+
+            /* Read the whole string */
+            while (*p != '\0') {
+                if (*p == XML_VARIABLE_BEGIN) {
                     tp = 0;
                     p++;
-                    memset(lvar, '\0', 256);
-                    
-                    while(1)
-                    {
-                        if((*p == XML_VARIABLE_BEGIN)
-                            ||(*p == '\0')
-                            ||(*p == '.')
-                            ||(*p == '|')
-                            ||(*p == ',')
-                            ||(*p == ' '))
-                        {
-                            lvar[tp]='\0';
-
-                            final = init+tp;
-                            
-                            /* Looking for var */
-                            for(j=0; j<s; j++)
-                            {
-                                int tsize = 0;
-
-                                /* Store everything up the variable name */
-                                char *var_placeh;
-
-
-                                if(var[j] == NULL)
+                    memset(lvar, '\0', XML_VARIABLE_MAXSIZE);
+
+                    while (1) {
+                        if ((*p == XML_VARIABLE_BEGIN)
+                                || (*p == '\0')
+                                || (*p == '.')
+                                || (*p == '|')
+                                || (*p == ',')
+                                || (*p == ' ')) {
+                            lvar[tp] = '\0';
+
+                            /* Look for var */
+                            for (j = 0; j < s; j++) {
+                                if (var[j] == NULL) {
                                     break;
+                                }
 
-                                if(strcasecmp(var[j], lvar) != 0)
-                                {
+                                if (strcasecmp(var[j], lvar) != 0) {
                                     continue;
                                 }
 
-
-                                tsize = strlen(_lxml->ct[i]) + 
-                                        strlen(value[j]) - tp + 1;
-
+                                size_t tsize = strlen(_lxml->ct[i]) +
+                                               strlen(value[j]) - tp + 1;
                                 var_placeh = strdup(_lxml->ct[i]);
-
                                 free(_lxml->ct[i]);
+                                _lxml->ct[i] = (char *)calloc(tsize + 2,
+                                                              sizeof(char));
 
-                                _lxml->ct[i] = (char*)calloc(tsize +2, 
-                                                             sizeof(char));
-                                
-                                if(_lxml->ct[i] == NULL || var_placeh == NULL)
-                                {
-                                    snprintf(_lxml->err,128, "XML_ERR: Memory "
-                                                             "error");
-                                    return(-1);
+                                if (_lxml->ct[i] == NULL || var_placeh == NULL) {
+                                    snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory "
+                                             "error.");
+                                    goto fail;
                                 }
 
-
                                 strncpy(_lxml->ct[i], var_placeh, tsize);
-                                
 
                                 _lxml->ct[i][init] = '\0';
-                                strncat(_lxml->ct[i], value[j],tsize - init);
-
+                                strncat(_lxml->ct[i], value[j], tsize - init);
 
                                 init = strlen(_lxml->ct[i]);
-                                strncat(_lxml->ct[i], p, 
-                                         tsize - strlen(_lxml->ct[i]));
-                                
+                                strncat(_lxml->ct[i], p,
+                                        tsize - strlen(_lxml->ct[i]));
 
                                 free(var_placeh);
+                                var_placeh = NULL;
 
                                 break;
                             }
-                            
-                            /* Variale not found */
-                            if((j == s) && (strlen(lvar) >= 1))
-                            {
-                                snprintf(_lxml->err,128, 
-                                                "XML_ERR: Unknown variable"
-                                                ": %s", lvar);
-                                return(-1);
-                            }
-                            else if(j == s)
-                            {
+
+                            /* Variable not found */
+                            if ((j == s) && (strlen(lvar) >= 1)) {
+                                snprintf(_lxml->err, XML_ERR_LENGTH,
+                                         "XMLERR: Unknown variable"
+                                         ": '%s'.", lvar);
+                                _lxml->err_line = _lxml->ln[i];
+                                goto fail;
+                            } else if (j == s) {
                                 init++;
                             }
-                            
+
                             goto go_next;
                         }
-                        
+
                         /* Maximum size for a variable */
-                        if(tp >= 255)
-                        {
-                            snprintf(_lxml->err,128, "XML_ERR: Invalid "
-                                                     "variable size.");
-                            return(-1);
+                        if (tp >= XML_VARIABLE_MAXSIZE - 1) {
+                            snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Invalid "
+                                     "variable name size: '%u'.", tp);
+                            _lxml->err_line = _lxml->ln[i];
+                            goto fail;
 
                         }
-                        
+
                         lvar[tp] = *p;
                         tp++;
                         p++;
                     }
                 } /* IF XML_VAR_BEGIN */
-                
+
                 p++;
                 init++;
 
-                go_next:
+go_next:
                 continue;
-                
+
             } /* WHILE END */
-            
-            if(p2 != NULL)
-            {
+
+            if (p2 != NULL) {
                 free(p2);
                 p2 = NULL;
                 p = NULL;
@@ -260,34 +218,18 @@ int OS_ApplyVariables(OS_XML *_lxml)
         }
     }
 
+    goto cleanup;
 
-    /* Cleaning the variables */
-    for(i=0;i<s;i++)
-    {
-        if((var)&&(var[i]))
-        {
-            free(var[i]);
-            var[i] = NULL;
-        }
-        if((value)&&(value[i]))
-        {
-            free(value[i]);    
-            value[i] = NULL;
-        }
-    }
-    
-    if(var != NULL)
-    {
-        free(var);
-        var = NULL;
-    }
-    if(value != NULL)
-    {
-        free(value);    
-        value = NULL;
-    }
+fail:
+    retval = -1;
+
+cleanup:
+    /* Clean up the variables */
+    free(var);
+    free(value);
+    free(p2);
+    free(var_placeh);
 
-    return(0);
+    return (retval);
 }
 
-/* UFA :) or EOF */