Browse Source

opt: don't use raw malloc for errors.

We should be allocating them with opt's allocator (we use it to free them!).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 10 years ago
parent
commit
0634e5dea8
2 changed files with 9 additions and 3 deletions
  1. 1 2
      ccan/opt/helpers.c
  2. 8 1
      ccan/opt/test/run-set_alloc.c

+ 1 - 2
ccan/opt/helpers.c

@@ -14,10 +14,9 @@
 /* Upper bound to sprintf this simple type?  Each 3 bits < 1 digit. */
 /* Upper bound to sprintf this simple type?  Each 3 bits < 1 digit. */
 #define CHAR_SIZE(type) (((sizeof(type)*CHAR_BIT + 2) / 3) + 1)
 #define CHAR_SIZE(type) (((sizeof(type)*CHAR_BIT + 2) / 3) + 1)
 
 
-/* FIXME: asprintf module? */
 static char *arg_bad(const char *fmt, const char *arg)
 static char *arg_bad(const char *fmt, const char *arg)
 {
 {
-	char *str = malloc(strlen(fmt) + strlen(arg));
+	char *str = opt_alloc.alloc(strlen(fmt) + strlen(arg));
 	sprintf(str, fmt, arg);
 	sprintf(str, fmt, arg);
 	return str;
 	return str;
 }
 }

+ 8 - 1
ccan/opt/test/run-set_alloc.c

@@ -66,8 +66,9 @@ static void freefn(void *ptr)
 int main(int argc, char *argv[])
 int main(int argc, char *argv[])
 {
 {
 	const char *myname = argv[0];
 	const char *myname = argv[0];
+	unsigned int val;
 
 
-	plan_tests(220);
+	plan_tests(222);
 
 
 	opt_set_alloc(allocfn, reallocfn, freefn);
 	opt_set_alloc(allocfn, reallocfn, freefn);
 
 
@@ -341,6 +342,12 @@ int main(int argc, char *argv[])
 	ok1(strcmp(argv[4], "-a") == 0);
 	ok1(strcmp(argv[4], "-a") == 0);
 	ok1(!argv[5]);
 	ok1(!argv[5]);
 
 
+	/* Finally, test the helpers don't use malloc. */
+	reset_options();
+	opt_register_arg("-a", opt_set_uintval, opt_show_uintval, &val, "a");
+	ok1(!parse_args(&argc, &argv, "-a", "notanumber", NULL));
+	ok1(strstr(err_output, ": -a: 'notanumber' is not a number"));
+
 	/* We should have tested each one at least once! */
 	/* We should have tested each one at least once! */
 	ok1(realloc_count);
 	ok1(realloc_count);
 	ok1(alloc_count);
 	ok1(alloc_count);