summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2011-12-15 14:15:47 +1030
committerRusty Russell <rusty@rustcorp.com.au>2011-12-15 14:15:47 +1030
commitec822c6589eeaeb3f45c12876db2016be5808688 (patch)
tree7670e1fb853e9f4750044bfeb47d9659eca57217
parente59b7388d8b2b56dc759be7c2dbf63100d2e131f (diff)
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.
-rw-r--r--ccan/opt/helpers.c8
-rw-r--r--ccan/opt/test/run-helpers.c18
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 <ccan/opt/helpers.c>
#include <ccan/opt/opt.c>
#include <ccan/opt/usage.c>
@@ -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;
}