From ec822c6589eeaeb3f45c12876db2016be5808688 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 15 Dec 2011 14:15:47 +1030 Subject: [PATCH] opt: don't leak on exit (valgrind complains). Recent real usage case showed this leak when we call opt_usage_and_exit: we don't bother freeing before exit. With valgrind, it matters. --- ccan/opt/helpers.c | 8 +++++++- ccan/opt/test/run-helpers.c | 18 +++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/ccan/opt/helpers.c b/ccan/opt/helpers.c index 420a97a4..17d56e02 100644 --- a/ccan/opt/helpers.c +++ b/ccan/opt/helpers.c @@ -123,12 +123,18 @@ char *opt_inc_intval(int *i) char *opt_version_and_exit(const char *version) { printf("%s\n", version); + /* Don't have valgrind complain! */ + opt_free_table(); exit(0); } char *opt_usage_and_exit(const char *extra) { - printf("%s", opt_usage(opt_argv0, extra)); + char *usage = opt_usage(opt_argv0, extra); + printf("%s", usage); + /* Don't have valgrind complain! */ + free(usage); + opt_free_table(); exit(0); } diff --git a/ccan/opt/test/run-helpers.c b/ccan/opt/test/run-helpers.c index 589962fe..f85c73c4 100644 --- a/ccan/opt/test/run-helpers.c +++ b/ccan/opt/test/run-helpers.c @@ -19,9 +19,6 @@ static int saved_fprintf(FILE *ignored, const char *fmt, ...); #define vfprintf(f, fmt, ap) saved_vprintf(fmt, ap) static int saved_vprintf(const char *fmt, va_list ap); -#define malloc(size) saved_malloc(size) -static void *saved_malloc(size_t size); - #include #include #include @@ -65,13 +62,6 @@ static int saved_fprintf(FILE *ignored, const char *fmt, ...) return ret; } -#undef malloc -static void *last_allocation; -static void *saved_malloc(size_t size) -{ - return last_allocation = malloc(size); -} - static void set_args(int *argc, char ***argv, ...) { va_list ap; @@ -87,7 +77,7 @@ static void set_args(int *argc, char ***argv, ...) /* Test helpers. */ int main(int argc, char *argv[]) { - plan_tests(452); + plan_tests(454); /* opt_set_bool */ { @@ -1005,6 +995,8 @@ int main(int argc, char *argv[]) fail("opt_show_version_and_exit returned?"); } else { ok1(exitval - 1 == 0); + /* We should have freed table!. */ + ok1(opt_table == NULL); } ok1(strcmp(output, "1.2.3\n") == 0); free(output); @@ -1027,14 +1019,14 @@ int main(int argc, char *argv[]) fail("opt_usage_and_exit returned?"); } else { ok1(exitval - 1 == 0); + /* We should have freed table!. */ + ok1(opt_table == NULL); } ok1(strstr(output, "[args]")); ok1(strstr(output, argv[0])); ok1(strstr(output, "[-a]")); free(output); free(argv); - /* It exits without freeing usage string. */ - free(last_allocation); output = NULL; } -- 2.39.2