X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?a=blobdiff_plain;f=src%2Fos_xml%2Fos_xml_variables.c;h=efbbaf99dce1fd8e892318b0bed43b74399ee9a0;hb=3f728675941dc69d4e544d3a880a56240a6e394a;hp=2fd80695d10574d34b490eb35ea7342152245b4e;hpb=6ef2f786c6c8ead94841b5f93baf9f43421f08c8;p=ossec-hids.git diff --git a/src/os_xml/os_xml_variables.c b/src/os_xml/os_xml_variables.c old mode 100755 new mode 100644 index 2fd8069..efbbaf9 --- a/src/os_xml/os_xml_variables.c +++ b/src/os_xml/os_xml_variables.c @@ -1,5 +1,3 @@ -/* $OSSEC, os_xml_node_variables.c, v0.3, 2005/04/12, Daniel B. Cid$ */ - /* Copyright (C) 2009 Trend Micro Inc. * All rights reserved. * @@ -9,219 +7,180 @@ * Foundation */ -/* os_xml C Library. - * Available at http://www.ossec.net/ - */ - - #include #include #include #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; - - /* No variables. */ - if(!_lxml->cur) - return(0); - - - /* Getting all variables */ - for(;i<_lxml->cur;i++) - { - if(_lxml->tp[i] == XML_VARIABLE_BEGIN) - { + /* Get all variables */ + for (i = 0; i < _lxml->cur; i++) { + if (_lxml->tp[i] == XML_VARIABLE_BEGIN) { int _found_var = 0; - j = i+1; - for(;j<_lxml->cur;j++) - { - if(_lxml->rl[j] < _lxml->rl[i]) + 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],"name") == 0)) - { - if(!_lxml->ct[j]) - 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; + } - /* If not used, it will be cleaned latter */ - snprintf(_lxml->err, 128, "XML_ERR: Memory error"); + /* If not used, it will be cleaned later */ + snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error."); - var = (char**)realloc(var,(s+1)*sizeof(char *)); - if(var == NULL) - return (-1); + tmp = (char **)realloc(var, (s + 1) * sizeof(char *)); + if (tmp == NULL) { + goto fail; + } + var = tmp; - var[s] = strdup(_lxml->ct[j]); - if(var[s] == NULL) - return(-1); + var[s] = _lxml->ct[j]; - /* 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, XML_ERR_LENGTH, "XMLERR: Memory error."); - snprintf(_lxml->err,128, "XML_ERR: Memory error"); - - value = (char**)realloc(value,(s+1)*sizeof(char *)); - if (value == NULL) - return(-1); + tmp = (char **)realloc(value, (s + 1) * sizeof(char *)); + if (tmp == NULL) { + goto fail; + } + value = tmp; - value[s] = strdup(_lxml->ct[i]); - if(value[s] == NULL) - return(-1); + value[s] = _lxml->ct[i]; - strncpy(_lxml->err," ", 3); + 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 */ + char lvar[XML_VARIABLE_MAXSIZE]; /* MAX Var size */ - if(strlen(_lxml->ct[i]) <= 2) + if (strlen(_lxml->ct[i]) <= 2) { continue; + } + /* Check if any variable is defined */ + if (s == 0) { + continue; + } - /* Duplicating string */ + /* Duplicate string */ p = strdup(_lxml->ct[i]); - p2= p; + p2 = p; - if(p == NULL) - { - snprintf(_lxml->err, 128, "XML_ERR: Memory error"); - return(-1); + 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; jct[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])); - + 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++; } @@ -229,11 +188,11 @@ int OS_ApplyVariables(OS_XML *_lxml) } /* 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; } @@ -246,13 +205,12 @@ int OS_ApplyVariables(OS_XML *_lxml) 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