On failure exit, we may have allocated space for the culltalbes. Free the space before exit. Signed-off-by: Wang Sheng-Hui <shhuiw@xxxxxxxxx> --- cachefilesd.c | 29 ++++++++++++++++++++++++++--- 1 files changed, 26 insertions(+), 3 deletions(-) diff --git a/cachefilesd.c b/cachefilesd.c index f5c04ec..0ac5e5c 100644 --- a/cachefilesd.c +++ b/cachefilesd.c @@ -92,8 +92,8 @@ static int jumpstart_scan = 0; * culled objects */ static unsigned culltable_size = 4096; -static struct object **cullbuild; -static struct object **cullready; +static struct object **cullbuild = NULL; +static struct object **cullready = NULL; static int oldest_build = -1; static int oldest_ready = -1; @@ -145,6 +145,26 @@ void help(void) exit(2); } +static void free_culltable(void) +{ + if (cullbuild) { + while (oldest_build >= 0) { + if (((long)cullbuild[oldest_build] & 0xf0000000) != 0x60000000) + free(cullbuild[oldest_build]); + oldest_build--; + } + free(cullbuild); + } + if (cullready) { + while (oldest_ready >= 0) { + if (((long)cullready[oldest_ready] & 0xf0000000) != 0x60000000) + free(cullready[oldest_ready]); + oldest_ready--; + } + free(cullready); + } +} + static __attribute__((noreturn, format(printf, 2, 3))) void __error(int excode, const char *fmt, ...) { @@ -168,6 +188,7 @@ void __error(int excode, const char *fmt, ...) closelog(); } + free_culltable(); exit(excode); } @@ -659,6 +680,8 @@ static void cachefilesd(void) reap_graveyard(); } + free_culltable(); + notice("Daemon Terminated"); exit(0); } @@ -1419,7 +1442,7 @@ static void decant_cull_table(void) check: for (loop = 0; loop < oldest_ready; loop++) if (((long)cullready[loop] & 0xf0000000) == 0x60000000) - abort(); + error("Bad object in cullready table (%d:%d)", oldest_ready, loop); } /*****************************************************************************/ -- 1.6.0.2 -- Linux-cachefs mailing list Linux-cachefs@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/linux-cachefs