tal: add tal_expand().
[ccan] / ccan / tal / test / run-overflow.c
index 6c4ccff4379dc97d4be669d8fe2c5224086c5618..c5daf97d2794b99966dd59e959cdab7d649be87f 100644 (file)
@@ -13,8 +13,9 @@ int main(void)
 {
        void *p;
        int *pi, *origpi;
+       char *cp;
 
-       plan_tests(26);
+       plan_tests(30);
 
        tal_set_backend(NULL, NULL, NULL, my_error);
 
@@ -28,57 +29,70 @@ int main(void)
 
        /* Now try overflow cases for tal_dup. */
        error_count = 0;
-       pi = origpi = tal_arr(NULL, int, 100);
-       ok1(pi);
+       origpi = tal_arr(NULL, int, 100);
+       ok1(origpi);
        ok1(error_count == 0);
-       pi = tal_dup(NULL, int, pi, (size_t)-1, 0);
+       pi = tal_dup(NULL, int, origpi, (size_t)-1, 0);
        ok1(!pi);
        ok1(error_count == 1);
-       pi = tal_dup(NULL, int, pi, 0, (size_t)-1);
+       pi = tal_dup(NULL, int, origpi, 0, (size_t)-1);
        ok1(!pi);
        ok1(error_count == 2);
 
-       pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int),
+       pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int),
                     (size_t)-1UL / sizeof(int));
        ok1(!pi);
        ok1(error_count == 3);
        /* This will still overflow when tal_hdr is added. */
-       pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int) / 2,
+       pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int) / 2,
                     (size_t)-1UL / sizeof(int) / 2);
        ok1(!pi);
        ok1(error_count == 4);
+       ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+       tal_free(origpi);
 
-       /* Now, check that with TAL_TAKE we free old one on failure. */
-       pi = tal_arr(NULL, int, 100);
+       /* Now, check that with taltk() we free old one on failure. */
+       origpi = tal_arr(NULL, int, 100);
        error_count = 0;
-       pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1, 0);
+       pi = tal_dup(NULL, int, take(origpi), (size_t)-1, 0);
        ok1(!pi);
        ok1(error_count == 1);
-       ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
 
-       pi = tal_arr(NULL, int, 100);
+       origpi = tal_arr(NULL, int, 100);
        error_count = 0;
-       pi = tal_dup(TAL_TAKE, int, pi, 0, (size_t)-1);
+       pi = tal_dup(NULL, int, take(origpi), 0, (size_t)-1);
        ok1(!pi);
        ok1(error_count == 1);
-       ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+       ok1(!tal_first(NULL));
 
-       pi = tal_arr(NULL, int, 100);
+       origpi = tal_arr(NULL, int, 100);
        error_count = 0;
-       pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int),
+       pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int),
                     (size_t)-1UL / sizeof(int));
        ok1(!pi);
        ok1(error_count == 1);
-       ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+       ok1(!tal_first(NULL));
 
-       pi = tal_arr(NULL, int, 100);
+       origpi = tal_arr(NULL, int, 100);
        error_count = 0;
        /* This will still overflow when tal_hdr is added. */
-       pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int) / 2,
+       pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int) / 2,
                     (size_t)-1UL / sizeof(int) / 2);
        ok1(!pi);
        ok1(error_count == 1);
-       ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
+       ok1(!tal_first(NULL));
+
+       /* Overflow on expand addition. */
+       cp = tal_arr(p, char, 100);
+       ok1(!tal_expand(&cp, NULL, (size_t)-99UL));
+       ok1(error_count == 2);
+       tal_free(cp);
+
+       /* Overflow when multiplied by size */
+       origpi = tal_arr(NULL, int, 100);
+       ok1(!tal_expand(&origpi, NULL, (size_t)-1UL / sizeof(int)));
+       ok1(error_count == 3);
+       tal_free(origpi);
 
        return exit_status();
 }