# HG changeset patch # User paulo # Date 1406702577 25200 # Node ID ebfc5261576813183d10b79476cd4edbcef0cb19 # Parent dfafe7582bd63470a4de9e6d91330dbd119d3852 fix segfault with long input lines diff -r dfafe7582bd6 -r ebfc52615768 rcg.c --- a/rcg.c Tue Mar 12 22:37:52 2013 -0600 +++ b/rcg.c Tue Jul 29 23:42:57 2014 -0700 @@ -101,6 +101,14 @@ return EXIT_REALLOC_ERROR; } +void *realloc_buffer(void *buffer, size_t buffer_len) +{ + void *new_buffer = realloc(buffer, buffer_len); + if (!new_buffer) + exit(realloc_error()); + return new_buffer; +} + Exit_code args_error() { char *usage = "\ @@ -195,9 +203,7 @@ if (bgcolor) { size_t l = strlen(clr) + 1 + strlen(bgcolor); - clr = realloc(clr, (l + 1)*sizeof(char)); - if (!clr) - exit(realloc_error()); + clr = realloc_buffer(clr, (l + 1)*sizeof(char)); strcat(clr, ";"); strcat(clr, bgcolor); } @@ -220,15 +226,6 @@ { re_err = regexec(re, &buf[buf_pos], 1, rem, 0); - //fprintf(stderr, "%s", &buf[buf_pos]); //d// 20100405 PBA - - if (out_len >= (BUFSIZE - buf_pos)) - out_len = (BUFSIZE - buf_pos) - 1; - - out = realloc(out, out_len*sizeof(char)); - if (!out) - exit(realloc_error()); - so = rem[0].rm_so; eo = rem[0].rm_eo; @@ -237,20 +234,16 @@ if (colorLine && match_len > 0) { so = 0; - eo = out_len - 2; + eo = out_len - 1; match_len = eo - so; } - //fprintf(stderr, "%d %d \n", so, eo); //d// 20100327 PBA - if (re_err != REG_NOMATCH && so >= 0 && eo >= 0 && match_len > 0) { size_t CLR_STRING_len = strlen(CLR_START) + strlen(clr) + strlen(CLR_END) + strlen(CLR_CLEAR); out_len += CLR_STRING_len; - out = realloc(out, out_len*sizeof(char)); - if (!out) - exit(realloc_error()); + out = realloc_buffer(out, out_len*sizeof(char)); snprintf(&out[out_pos], out_len, "%.*s%s%s%s%.*s%s", so, &buf[buf_pos], CLR_START, clr, CLR_END, match_len, &buf[buf_pos + so], CLR_CLEAR); @@ -259,6 +252,7 @@ } else { + out = realloc_buffer(out, out_len*sizeof(char)); strncpy(&out[out_pos], &buf[buf_pos], out_len - out_pos); out[out_len - 1] = '\0'; re_err = REG_NOMATCH;