X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?p=ossec-hids.git;a=blobdiff_plain;f=src%2Fconfig%2Frules-config.c;h=89c07217659b1ec54481f6d56f5820326ff0fdfe;hp=4801386f7002bed5fd82a949341913ddaf51efa4;hb=6ef2f786c6c8ead94841b5f93baf9f43421f08c8;hpb=301048b51990573e58a30dc4a5bb4ec285cad554 diff --git a/src/config/rules-config.c b/src/config/rules-config.c index 4801386..89c0721 100755 --- a/src/config/rules-config.c +++ b/src/config/rules-config.c @@ -1,4 +1,5 @@ -/* @(#) $Id$ */ +/* @(#) $Id: ./src/config/rules-config.c, 2011/09/08 dcid Exp $ + */ /* Copyright (C) 2009 Trend Micro Inc. * All right reserved. @@ -12,20 +13,20 @@ /* Functions to handle the configuration files */ - +#include "config.h" #include "shared.h" #include "global-config.h" -static int cmpr(const void *a, const void *b) { +static int cmpr(const void *a, const void *b) { /*printf("%s - %s\n", *(char **)a, *(char **)b);*/ return strcmp(*(char **)a, *(char **)b); } static int file_in_list(int list_size, char *f_name, char *d_name, char **alist) { - int i = 0; + int i = 0; for(i=0; i<(list_size-1); i++) { if((strcmp(alist[i], f_name) == 0 || strcmp(alist[i], d_name) == 0)) @@ -33,25 +34,26 @@ static int file_in_list(int list_size, char *f_name, char *d_name, char **alist) return(1); } } - return(0); + return(0); } int Read_Rules(XML_NODE node, void *configp, void *mailp) { int i = 0; + int ii = 0; int rules_size = 1; int lists_size = 1; int decoders_size = 1; - + char path[PATH_MAX +2]; char f_name[PATH_MAX +2]; - int start_point = 0; + int start_point = 0; int att_count = 0; struct dirent *entry; - DIR *dfd; - OSRegex regex; + DIR *dfd; + OSRegex regex; /* XML definitions */ @@ -59,14 +61,19 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) char *xml_rules_rule = "rule"; char *xml_rules_rules_dir = "rule_dir"; char *xml_rules_lists = "list"; - char *xml_rules_lists_dir = "list_dir"; char *xml_rules_decoders = "decoder"; char *xml_rules_decoders_dir = "decoder_dir"; _Config *Config; - + Config = (_Config *)configp; - + + /* initialise OSRegex */ + regex.patterns = NULL; + regex.prts_closure = NULL; + regex.prts_str = NULL; + regex.sub_strings = NULL; + while(node[i]) { if(!node[i]->element) @@ -80,11 +87,11 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) return(OS_INVALID); } /* Mail notification */ - else if((strcmp(node[i]->element, xml_rules_include) == 0) || + else if((strcmp(node[i]->element, xml_rules_include) == 0) || (strcmp(node[i]->element, xml_rules_rule) == 0)) { rules_size++; - Config->includes = realloc(Config->includes, + Config->includes = realloc(Config->includes, sizeof(char *)*rules_size); if(!Config->includes) { @@ -182,7 +189,7 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) snprintf(f_name, PATH_MAX +1, "%s/%s", node[i]->content, entry->d_name); /* Just ignore . and .. */ - if((strcmp(entry->d_name,".") == 0) || (strcmp(entry->d_name,"..") == 0)) + if((strcmp(entry->d_name,".") == 0) || (strcmp(entry->d_name,"..") == 0)) continue; /* no dups allowed */ @@ -196,6 +203,7 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) if(!Config->decoders) { merror(MEM_ERROR, ARGV0); + OSRegex_FreePattern(®ex); return(-1); } @@ -208,12 +216,11 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) debug1("Regex does not match \"%s\"", f_name); } } - + closedir(dfd); /* Sort just then newly added items */ qsort(Config->decoders + start_point , decoders_size- start_point -1, sizeof(char *), cmpr); } - int ii=0; debug1("decoders_size %d", decoders_size); for(ii=0;iidecoders[ii]); @@ -260,7 +267,7 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) snprintf(f_name, PATH_MAX +1, "%s/%s", node[i]->content, entry->d_name); /* Just ignore . and .. */ - if((strcmp(entry->d_name,".") == 0) || (strcmp(entry->d_name,"..") == 0)) + if((strcmp(entry->d_name,".") == 0) || (strcmp(entry->d_name,"..") == 0)) continue; /* no dups allowed */ @@ -274,6 +281,7 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) if(!Config->includes) { merror(MEM_ERROR, ARGV0); + OSRegex_FreePattern(®ex); return(-1); } @@ -286,7 +294,7 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) debug1("Regex does not match \"%s\"", f_name); } } - + closedir(dfd); /* Sort just then newly added items */ qsort(Config->includes + start_point , rules_size - start_point -1, sizeof(char *), cmpr); @@ -295,6 +303,7 @@ int Read_Rules(XML_NODE node, void *configp, void *mailp) else { merror(XML_INVELEM, ARGV0, node[i]->element); + OSRegex_FreePattern(®ex); return(OS_INVALID); } i++;