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=e474cda8561517b5a4dfd4785a42b511a40f4d86;hpb=914feba5d54f979cd5d7e69c349c3d01f630042a;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 e474cda..efbbaf9 --- a/src/os_xml/os_xml_variables.c +++ b/src/os_xml/os_xml_variables.c @@ -1,258 +1,216 @@ -/* $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 #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; + /* 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; 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])); - + 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