opt: don't use raw malloc for errors.
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 21 Oct 2015 05:35:49 +0000 (16:05 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 21 Oct 2015 05:37:02 +0000 (16:07 +1030)
We should be allocating them with opt's allocator (we use it to free them!).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/opt/helpers.c
ccan/opt/test/run-set_alloc.c

index f247301cd7a2ba236871f8327c56a79ea144509f..118e543602e06b981e6faee7dd5f416cf819d5cd 100644 (file)
 /* Upper bound to sprintf this simple type?  Each 3 bits < 1 digit. */
 #define CHAR_SIZE(type) (((sizeof(type)*CHAR_BIT + 2) / 3) + 1)
 
-/* FIXME: asprintf module? */
 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);
        return str;
 }
index b30a77d8fc552aa8c293ee303f62081c7fab60a8..6a10d5979fca77d9e024fca95e962108ad66dbe4 100644 (file)
@@ -66,8 +66,9 @@ static void freefn(void *ptr)
 int main(int argc, char *argv[])
 {
        const char *myname = argv[0];
+       unsigned int val;
 
-       plan_tests(220);
+       plan_tests(222);
 
        opt_set_alloc(allocfn, reallocfn, freefn);
 
@@ -341,6 +342,12 @@ int main(int argc, char *argv[])
        ok1(strcmp(argv[4], "-a") == 0);
        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! */
        ok1(realloc_count);
        ok1(alloc_count);