X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?a=blobdiff_plain;f=src%2Fos_regex%2Fos_match_compile.c;h=2fc552a198714bbe4368aeb7fb8fcafa7c64d495;hb=6ef2f786c6c8ead94841b5f93baf9f43421f08c8;hp=8521b3f11bd3ab68f4868ca1b218b0de494a4af1;hpb=914feba5d54f979cd5d7e69c349c3d01f630042a;p=ossec-hids.git diff --git a/src/os_regex/os_match_compile.c b/src/os_regex/os_match_compile.c index 8521b3f..2fc552a 100755 --- a/src/os_regex/os_match_compile.c +++ b/src/os_regex/os_match_compile.c @@ -5,7 +5,7 @@ * * 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 */ @@ -24,6 +24,7 @@ int _os_strncmp(char *pattern, char *str, int str_len, int size); int _os_strcmp_last(char *pattern, char *str, int str_len, int size); int _os_strcmp(char *pattern, char *str, int str_len, int size); int _os_strmatch(char *pattern, char *str, int str_len, int size); +int _os_strstr(char *pattern, char *str, int str_len, int size); /** int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) v0.1 @@ -35,21 +36,22 @@ int _os_strmatch(char *pattern, char *str, int str_len, int size); */ int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) { + int usstrstr = 0; int i = 0; int count = 0; int end_of_string = 0; - + char *pt; char *new_str; char *new_str_free = NULL; - + /* Checking for references not initialized */ if(reg == NULL) { return(0); } - + /* Initializing OSRegex structure */ reg->error = 0; @@ -71,8 +73,8 @@ int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) reg->error = OS_REGEX_MAXSIZE; goto compile_error; } - - + + /* Duping the pattern for our internal work */ new_str = strdup(pattern); if(!new_str) @@ -82,35 +84,40 @@ int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) } new_str_free = new_str; pt = new_str; - - + + + /* Getting the number of sub patterns */ while(*pt != '\0') { - /* The pattern must be always lower case if + /* The pattern must be always lower case if * case sensitive is set */ if(!(flags & OS_CASE_SENSITIVE)) { *pt = charmap[(uchar)*pt]; } - - /* Number of sub patterns */ + + /* Number of sub patterns */ if(*pt == OR) { count++; } - pt++; + else if(*pt == -29) + { + usstrstr = 1; + } + pt++; } - - + + /* For the last pattern */ count++; reg->patterns = calloc(count +1, sizeof(char *)); reg->size = calloc(count +1, sizeof(int)); reg->match_fp = calloc(count +1, sizeof(void *)); - - + + /* Memory allocation error check */ if(!reg->patterns || !reg->size || !reg->match_fp) { @@ -127,12 +134,12 @@ int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) reg->size[i] = 0; } i = 0; - - + + /* Reassigning pt to the beginning of the string */ pt = new_str; - + /* Getting the sub patterns */ do { @@ -148,7 +155,7 @@ int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) /* Dupping the string */ if(*new_str == BEGINREGEX) reg->patterns[i] = strdup(new_str +1); - else + else reg->patterns[i] = strdup(new_str); /* Memory error */ @@ -179,13 +186,20 @@ int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) reg->size[i] = strlen(reg->patterns[i]) -1; reg->patterns[i][reg->size[i]] = '\0'; } - + /* If string starts with ^, use strncmp */ else if(*new_str == BEGINREGEX) { reg->match_fp[i] = _os_strncmp; reg->size[i] = strlen(reg->patterns[i]); } + + else if(usstrstr == 1) + { + reg->match_fp[i] = _os_strstr; + reg->size[i] = strlen(reg->patterns[i]); + } + else { reg->match_fp[i] = _OS_Match; @@ -209,16 +223,16 @@ int OSMatch_Compile(char *pattern, OSMatch *reg, int flags) /* Success return */ free(new_str_free); return(1); - - + + /* Error handling */ compile_error: - + if(new_str_free) { free(new_str_free); } - + OSMatch_FreePattern(reg); return(0);