From 6863ca2831b26c73b091e5e4b4215f5112ed2362 Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Thu, 3 Sep 2015 13:49:27 +0200 Subject: Double memory when increasing buffer --- colorize.c | 31 +++++++++++++++++++++---------- t/merge.t | 61 +++++++++++++++++++++++++++++++------------------------------ 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/colorize.c b/colorize.c index 476b2cc..8e37e19 100644 --- a/colorize.c +++ b/colorize.c @@ -104,6 +104,8 @@ && (streq (color_names[color2]->name, "none") \ || streq (color_names[color2]->name, "default")) \ +#define ALLOC_COMPLETE_PART_LINE 8 + #define COLOR_SEP_CHAR '/' #define DEBUG_FILE "debug.txt" @@ -211,9 +213,9 @@ static void process_args (unsigned int, char **, bool *, const struct color **, static void process_file_arg (const char *, const char **, FILE **); static void read_print_stream (bool, const struct color **, const char *, FILE *); static void merge_print_line (bool, const struct color **, const char *, const char *, FILE *); -static void complete_part_line (const char *, char **, FILE *); +static void complete_part_line (const char *, char **, size_t, FILE *); static bool get_next_char (char *, const char **, FILE *, bool *); -static void save_char (char, char **, unsigned long *); +static void save_char (char, char **, unsigned long *, size_t *); static void find_color_entries (struct color_name **, const struct color **); static void find_color_entry (const struct color_name *, unsigned int, const struct color **); static void print_line (bool, const struct color **, const char * const, unsigned int); @@ -767,12 +769,15 @@ read_print_stream (bool bold, const struct color **colors, const char *file, FIL static void merge_print_line (bool bold, const struct color **colors, const char *line, const char *p, FILE *stream) { - char *buf = xmalloc (1); + char *buf; + const size_t size = ALLOC_COMPLETE_PART_LINE; char *merged_part_line = NULL; const char *part_line; + buf = xmalloc (size); *buf = '\0'; - complete_part_line (p + 1, &buf, stream); + + complete_part_line (p + 1, &buf, size, stream); if (*buf != '\0') part_line = merged_part_line = str_concat (line, buf); @@ -791,7 +796,7 @@ merge_print_line (bool bold, const struct color **colors, const char *line, cons } static void -complete_part_line (const char *p, char **buf, FILE *stream) +complete_part_line (const char *p, char **buf, size_t size, FILE *stream) { bool got_next_char = false, read_from_stream; char ch; @@ -802,7 +807,7 @@ complete_part_line (const char *p, char **buf, FILE *stream) if (ch == '[') { if (read_from_stream) - save_char (ch, buf, &i); + save_char (ch, buf, &i, &size); } else { @@ -819,7 +824,7 @@ complete_part_line (const char *p, char **buf, FILE *stream) if (isdigit (ch) || ch == ';') { if (read_from_stream) - save_char (ch, buf, &i); + save_char (ch, buf, &i, &size); } else /* read next character */ { @@ -833,7 +838,7 @@ complete_part_line (const char *p, char **buf, FILE *stream) if (ch == 'm') { if (read_from_stream) - save_char (ch, buf, &i); + save_char (ch, buf, &i, &size); } else { @@ -874,9 +879,15 @@ get_next_char (char *ch, const char **p, FILE *stream, bool *read_from_stream) } static void -save_char (char ch, char **buf, unsigned long *i) +save_char (char ch, char **buf, unsigned long *i, size_t *size) { - *buf = xrealloc (*buf, *i + 2); /* +1: size of buf, +1: space for NUL */ + assert (*i < *size); + /* +1: effective occupied size of buffer */ + if ((*i + 1) == *size) + { + *size *= 2; + *buf = xrealloc (*buf, *size); + } (*buf)[*i] = ch; (*buf)[*i + 1] = '\0'; (*i)++; diff --git a/t/merge.t b/t/merge.t index fe73c2b..b5c6dc7 100755 --- a/t/merge.t +++ b/t/merge.t @@ -10,36 +10,37 @@ use Test::More; # sequence, buffer sizes my @merge_success = ( - [ "\e[30m", [ 1..4 ] ], - [ "\e[31m", [ 1..4 ] ], - [ "\e[32m", [ 1..4 ] ], - [ "\e[33m", [ 1..4 ] ], - [ "\e[34m", [ 1..4 ] ], - [ "\e[35m", [ 1..4 ] ], - [ "\e[36m", [ 1..4 ] ], - [ "\e[37m", [ 1..4 ] ], - [ "\e[39m", [ 1..4 ] ], - [ "\e[1;30m", [ 1..6 ] ], - [ "\e[1;31m", [ 1..6 ] ], - [ "\e[1;32m", [ 1..6 ] ], - [ "\e[1;33m", [ 1..6 ] ], - [ "\e[1;34m", [ 1..6 ] ], - [ "\e[1;35m", [ 1..6 ] ], - [ "\e[1;36m", [ 1..6 ] ], - [ "\e[1;37m", [ 1..6 ] ], - [ "\e[1;39m", [ 1..6 ] ], - [ "\e[40m", [ 1..4 ] ], - [ "\e[41m", [ 1..4 ] ], - [ "\e[42m", [ 1..4 ] ], - [ "\e[43m", [ 1..4 ] ], - [ "\e[44m", [ 1..4 ] ], - [ "\e[45m", [ 1..4 ] ], - [ "\e[46m", [ 1..4 ] ], - [ "\e[47m", [ 1..4 ] ], - [ "\e[49m", [ 1..4 ] ], - [ "\e[0m", [ 1..3 ] ], - [ "\e[m", [ 1..2 ] ], - [ "\e[;;m", [ 1..4 ] ], + [ "\e[30m", [ 1..4 ] ], + [ "\e[31m", [ 1..4 ] ], + [ "\e[32m", [ 1..4 ] ], + [ "\e[33m", [ 1..4 ] ], + [ "\e[34m", [ 1..4 ] ], + [ "\e[35m", [ 1..4 ] ], + [ "\e[36m", [ 1..4 ] ], + [ "\e[37m", [ 1..4 ] ], + [ "\e[39m", [ 1..4 ] ], + [ "\e[1;30m", [ 1..6 ] ], + [ "\e[1;31m", [ 1..6 ] ], + [ "\e[1;32m", [ 1..6 ] ], + [ "\e[1;33m", [ 1..6 ] ], + [ "\e[1;34m", [ 1..6 ] ], + [ "\e[1;35m", [ 1..6 ] ], + [ "\e[1;36m", [ 1..6 ] ], + [ "\e[1;37m", [ 1..6 ] ], + [ "\e[1;39m", [ 1..6 ] ], + [ "\e[40m", [ 1..4 ] ], + [ "\e[41m", [ 1..4 ] ], + [ "\e[42m", [ 1..4 ] ], + [ "\e[43m", [ 1..4 ] ], + [ "\e[44m", [ 1..4 ] ], + [ "\e[45m", [ 1..4 ] ], + [ "\e[46m", [ 1..4 ] ], + [ "\e[47m", [ 1..4 ] ], + [ "\e[49m", [ 1..4 ] ], + [ "\e[0m", [ 1..3 ] ], + [ "\e[m", [ 1..2 ] ], + [ "\e[;;m", [ 1..4 ] ], + [ "\e[123456m", [ 1 ] ], # tightly coupled to ALLOC_COMPLETE_PART_LINE ); # sequence, buffer size my @merge_fail = ( -- cgit v1.2.3