From 598ea3fd305852552bd2f38e7a5f7c332760af93 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 30 Sep 2020 13:47:35 +0200 Subject: [PATCH] col: enable deallocation on exit also for __SANITIZE_ADDRESS__ The macro FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION does not have to enabled in all cases (e.g. default travis-ci, local tests, ...). It seems more robust also check for __SANITIZE_ADDRESS__ too. Addresses: https://github.com/karelzak/util-linux/pull/1115 Signed-off-by: Karel Zak --- text-utils/col.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/text-utils/col.c b/text-utils/col.c index edbd1f218..e35e581cd 100644 --- a/text-utils/col.c +++ b/text-utils/col.c @@ -89,6 +89,10 @@ /* number of lines to allocate */ #define NALLOC 64 +#if defined(__SANITIZE_ADDRESS__) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) +# define COL_DEALLOCATE_ON_EXIT +#endif + /* SI & SO charset mode */ enum { CS_NORMAL, @@ -114,7 +118,7 @@ struct col_line { uint8_t l_needs_sort:1; /* set if chars went in out of order */ }; -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef COL_DEALLOCATE_ON_EXIT /* * Free memory before exit when compiling LeakSanitizer. */ @@ -130,7 +134,7 @@ struct col_ctl { size_t max_bufd_lines; /* max # lines to keep in memory */ struct col_line *line_freelist; size_t nblank_lines; /* # blanks after last flushed line */ -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef COL_DEALLOCATE_ON_EXIT struct col_alloc *alloc_root; /* first of line allocations */ struct col_alloc *alloc_head; /* latest line allocation */ #endif @@ -340,7 +344,7 @@ static struct col_line *alloc_line(struct col_ctl *ctl) if (!ctl->line_freelist) { l = xmalloc(sizeof(struct col_line) * NALLOC); -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef COL_DEALLOCATE_ON_EXIT if (ctl->alloc_root == NULL) { ctl->alloc_root = xcalloc(1, sizeof(struct col_alloc)); ctl->alloc_root->l = l; @@ -580,7 +584,7 @@ static void parse_options(struct col_ctl *ctl, int argc, char **argv) } } -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef COL_DEALLOCATE_ON_EXIT static void free_line_allocations(struct col_alloc *root) { struct col_alloc *next; @@ -670,7 +674,7 @@ int main(int argc, char **argv) for (; ctl.l->l_next; ctl.l = ctl.l->l_next) lns.this_line++; if (lns.max_line == 0 && lns.cur_col == 0) { -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef COL_DEALLOCATE_ON_EXIT free_line_allocations(ctl.alloc_root); #endif return EXIT_SUCCESS; /* no lines, so just exit */ @@ -689,7 +693,7 @@ int main(int argc, char **argv) /* missing a \n on the last line? */ ctl.nblank_lines = 2; flush_blanks(&ctl); -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef COL_DEALLOCATE_ON_EXIT free_line_allocations(ctl.alloc_root); #endif return ret;