Browse Source

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.
Rusty Russell 14 years ago
parent
commit
ec822c6589
2 changed files with 12 additions and 14 deletions
  1. 7 1
      ccan/opt/helpers.c
  2. 5 13
      ccan/opt/test/run-helpers.c

+ 7 - 1
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);
 }
 

+ 5 - 13
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;
 	}