X-Git-Url: http://ftp.carnet.hr/pub/carnet-debian/scm?a=blobdiff_plain;f=src%2Fos_xml%2Fos_xml_variables.c;h=ad89a4f020f3560662a08af96067634cf7220bbb;hb=789cbc8e52da68eba3517b920ef22e000cf3c9fd;hp=b5a7e0953a90f31e398487a48bd3c9ffd7f9c4b0;hpb=301048b51990573e58a30dc4a5bb4ec285cad554;p=ossec-hids.git diff --git a/src/os_xml/os_xml_variables.c b/src/os_xml/os_xml_variables.c index b5a7e09..ad89a4f 100755 --- a/src/os_xml/os_xml_variables.c +++ b/src/os_xml/os_xml_variables.c @@ -19,51 +19,59 @@ #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; - - - /* No variables. */ - if(!_lxml->cur) - return(0); + char **tmp = NULL; + char *p2= NULL; + char *var_placeh = NULL; /* Getting all variables */ - for(;i<_lxml->cur;i++) + 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++) + 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->el[j])&&(strcasecmp(_lxml->el[j],XML_VAR_ATTRIBUTE) == 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 */ + { + 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, XML_ERR_LENGTH, "XMLERR: Memory error."); + + tmp = (char**)realloc(var,(s+1)*sizeof(char *)); + if(tmp == NULL) + goto fail; + var = tmp; + + var[s] = _lxml->ct[j]; + + /* Cleaning the lxml->err */ strncpy(_lxml->err," ", 3); _found_var = 1; @@ -71,72 +79,61 @@ int OS_ApplyVariables(OS_XML *_lxml) } else { - snprintf(_lxml->err, 128, - "XML_ERR: Only \"name\" is allowed" - " as an attribute for a variable"); - return(-1); + 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); + 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); - + + + 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))&& + else if(((_lxml->tp[i] == XML_ELEM) || (_lxml->tp[i] == XML_ATTR))&& (_lxml->ct[i])) { - int tp = 0,init = 0,final = 0; + 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) continue; - - - /* Duplicating string */ + + + /* Duplicating string */ p = strdup(_lxml->ct[i]); p2= p; - + if(p == NULL) { - snprintf(_lxml->err, 128, "XML_ERR: Memory error"); - return(-1); + snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error."); + goto fail; } - - + + /* Reading the whole string */ while(*p != '\0') { @@ -144,8 +141,8 @@ int OS_ApplyVariables(OS_XML *_lxml) { tp = 0; p++; - memset(lvar, '\0', 256); - + memset(lvar, '\0', XML_VARIABLE_MAXSIZE); + while(1) { if((*p == XML_VARIABLE_BEGIN) @@ -157,17 +154,9 @@ int OS_ApplyVariables(OS_XML *_lxml) { lvar[tp]='\0'; - final = init+tp; - /* Looking for var */ for(j=0; jct[i]) + + 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, + _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); + 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); init = strlen(_lxml->ct[i]); - strncat(_lxml->ct[i], p, + 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); + 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) + if(tp >= XML_VARIABLE_MAXSIZE - 1) { - snprintf(_lxml->err,128, "XML_ERR: Invalid " - "variable size."); - return(-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: continue; - + } /* WHILE END */ - + if(p2 != NULL) { free(p2); @@ -260,34 +252,19 @@ int OS_ApplyVariables(OS_XML *_lxml) } } + goto cleanup; + fail: + retval = -1; + + cleanup: /* Cleaning the variables */ - for(i=0;i