X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?p=ossec-hids.git;a=blobdiff_plain;f=src%2Fshared%2Fcustom_output_search_replace.c;fp=src%2Fshared%2Fcustom_output_search_replace.c;h=0a844b7d7e270720e5285bbb5598127ebfb020b6;hp=5fd6319d33a37b0dbf6c460f832c9d817ccda4db;hb=3f728675941dc69d4e544d3a880a56240a6e394a;hpb=927951d1c1ad45ba9e7325f07d996154a91c911b diff --git a/src/shared/custom_output_search_replace.c b/src/shared/custom_output_search_replace.c index 5fd6319..0a844b7 100644 --- a/src/shared/custom_output_search_replace.c +++ b/src/shared/custom_output_search_replace.c @@ -1,201 +1,116 @@ #include "shared.h" -char * searchAndReplace2(char* orig, char* search, char*value) -{ - char *p; - size_t total_len = strlen(orig); - size_t token_len = strlen(search); - size_t value_len = strlen(value); - - int inx_start = 0; - char * tmp = NULL; - int tmp_offset = 0; - int total_bytes_allocated = 0; - int from = 0; - p = strstr(orig, search); - if(p==NULL) - { - os_strdup(orig,tmp); - - return tmp; - } - if (value==NULL) - { - value=""; - } - inx_start = p - orig; - - while (p != NULL) - { - if (inx_start > 0) - { - if (tmp == NULL) - { - int len_to_add = (inx_start); - - tmp = (char*) malloc(sizeof(char) * len_to_add); - total_bytes_allocated += len_to_add; - - strncpy(tmp, orig + tmp_offset, inx_start); - tmp_offset = inx_start; - } - - total_bytes_allocated += value_len; - tmp = (char*) realloc(tmp, total_bytes_allocated); - - strncpy(tmp + tmp_offset, value, value_len); - tmp_offset += value_len; - - p = strstr(orig + inx_start + token_len, search); - if(p!=NULL) - { - inx_start = p - orig; - from = inx_start + token_len; - if (inx_start - tmp_offset > 0) - { - total_bytes_allocated += inx_start - from; - tmp = (char*) realloc(tmp, total_bytes_allocated); - strncpy(tmp + tmp_offset, orig + from, inx_start - from); - tmp_offset += inx_start - from; - } - }//No more coincidences. - else - { - from = inx_start + token_len; - } +char *searchAndReplace(const char *orig, const char *search, const char *value) +{ + char *p; + const size_t orig_len = strlen(orig); + const size_t search_len = strlen(search); + const size_t value_len = strlen(value); + + size_t inx_start; + char *tmp = NULL; + size_t tmp_offset = 0; + size_t total_bytes_allocated = 1; + size_t from; + + /* Check for any match */ + p = strstr(orig, search); + if (p == NULL) { + os_strdup(orig, tmp); + + return tmp; } - } - if ((from < total_len) && from>0) - { - total_bytes_allocated += total_len - from;//((from - (int)token_len) + (int)value_len); - tmp = (char*) realloc(tmp, total_bytes_allocated+1); - strncpy(tmp + tmp_offset, orig + from, total_len - from); - } - tmp[total_bytes_allocated]='\0'; - - return tmp; -} -#include "shared.h" -char * searchAndReplace(char* orig, char* search, char*value) -{ - char *p; - size_t total_len = strlen(orig); - size_t token_len = strlen(search); - size_t value_len = strlen(value); - - int inx_start = 0; - char * tmp = NULL; - int tmp_offset = 0; - int total_bytes_allocated = 0; - int from = 0; - p = strstr(orig, search); - if(p==NULL) - { - os_strdup(orig,tmp); + inx_start = (size_t) (p - orig); + from = inx_start + search_len; - return tmp; - } - if (value==NULL) - { - value=""; - } - inx_start = p - orig; - - while (p != NULL) - { - if (inx_start > 0) - { - if (tmp == NULL) - { - int len_to_add = (inx_start); - - tmp = (char*) malloc(sizeof(char) * len_to_add); - total_bytes_allocated += len_to_add; - - strncpy(tmp, orig + tmp_offset, inx_start); + /* Copy content before first match, if any */ + if (inx_start > 0) { + total_bytes_allocated = inx_start + 1; + tmp = (char *) malloc(sizeof(char) * total_bytes_allocated); + strncpy(tmp, orig, inx_start); tmp_offset = inx_start; - } - - total_bytes_allocated += value_len; - tmp = (char*) realloc(tmp, total_bytes_allocated); - - strncpy(tmp + tmp_offset, value, value_len); - tmp_offset += value_len; + } + while (p != NULL) { + /* Copy replacement */ + total_bytes_allocated += value_len; + os_realloc(tmp, total_bytes_allocated, tmp); + + strncpy(tmp + tmp_offset, value, value_len); + tmp_offset += value_len; + + /* Search for further occurrences */ + p = strstr(orig + inx_start + search_len, search); + if (p != NULL) { + size_t inx_start2 = (size_t) (p - orig); + + /* Copy content between matches, if any */ + if (inx_start2 > from) { + size_t gap = inx_start2 - from; + total_bytes_allocated += gap; + os_realloc(tmp, total_bytes_allocated, tmp); + strncpy(tmp + tmp_offset, orig + from, gap); + tmp_offset += gap; + } + + inx_start = inx_start2; + } - p = strstr(orig + inx_start + token_len, search); + /* Set position for copying content after last match */ + from = inx_start + search_len; + } - if(p!=NULL) - { - inx_start = p - orig; - from = inx_start + token_len; - if (inx_start - tmp_offset > 0) - { - total_bytes_allocated += inx_start - from; - tmp = (char*) realloc(tmp, total_bytes_allocated); - strncpy(tmp + tmp_offset, orig + from, inx_start - from); - tmp_offset += inx_start - from; - } - }//No more coincidences. - else - { - from = inx_start + token_len; - } + /* Copy content after last match, if any */ + if ((from < orig_len) && from > 0) { + total_bytes_allocated += orig_len - from; + os_realloc(tmp, total_bytes_allocated, tmp); + strncpy(tmp + tmp_offset, orig + from, orig_len - from); } - } - if ((from < total_len) && from>0) - { - total_bytes_allocated += total_len - from;//((from - (int)token_len) + (int)value_len); - tmp = (char*) realloc(tmp, total_bytes_allocated+1); - strncpy(tmp + tmp_offset, orig + from, total_len - from); - } - tmp[total_bytes_allocated]='\0'; + tmp[total_bytes_allocated - 1] = '\0'; - return tmp; + return tmp; } -//escape newlines characters. Returns a new allocated string. -char* escape_newlines(char *orig) +/* Escape newline characters. Returns a new allocated string. */ +char *escape_newlines(const char *orig) { - const char *ptr; - char *ret, *retptr; - int size; - - ptr = orig; - size = 1; - while (*ptr) - { - if ((*ptr == '\n') ||(*ptr == '\r')) - size += 2; - else - size += 1; - ptr++; - } - - ret = malloc (size); - ptr = orig; - retptr = ret; - while (*ptr) { - if (*ptr == '\n') { - *retptr = '\\'; - *(retptr+1) = 'n'; - retptr += 2; - } - else if (*ptr == '\r') { - *retptr = '\\'; - *(retptr+1) = 'n'; - retptr += 2; + const char *ptr; + char *ret, *retptr; + size_t size; + + ptr = orig; + size = 1; + while (*ptr) { + if ((*ptr == '\n') || (*ptr == '\r')) { + size += 2; + } else { + size += 1; + } + ptr++; } - else { - *retptr = *ptr; - retptr ++; + + ret = (char *) malloc (size); + ptr = orig; + retptr = ret; + while (*ptr) { + if (*ptr == '\n') { + *retptr = '\\'; + *(retptr + 1) = 'n'; + retptr += 2; + } else if (*ptr == '\r') { + *retptr = '\\'; + *(retptr + 1) = 'n'; + retptr += 2; + } else { + *retptr = *ptr; + retptr ++; + } + ptr++; } - ptr++; - } - *retptr = '\0'; + *retptr = '\0'; - return ret; + return ret; }