1 #include <ccan/tal/tal.h>
2 #include <ccan/tal/tal.c>
3 #include <ccan/tap/tap.h>
5 static int error_count;
7 static void my_error(const char *msg)
19 tal_set_backend(NULL, NULL, NULL, my_error);
21 p = tal_arr(NULL, int, (size_t)-1);
23 ok1(error_count == 1);
25 p = tal_arr(NULL, char, (size_t)-2);
27 ok1(error_count == 2);
29 /* Now try overflow cases for tal_dup. */
31 pi = origpi = tal_arr(NULL, int, 100);
33 ok1(error_count == 0);
34 pi = tal_dup(NULL, int, pi, (size_t)-1, 0);
36 ok1(error_count == 1);
37 pi = tal_dup(NULL, int, pi, 0, (size_t)-1);
39 ok1(error_count == 2);
41 pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int),
42 (size_t)-1UL / sizeof(int));
44 ok1(error_count == 3);
45 /* This will still overflow when tal_hdr is added. */
46 pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int) / 2,
47 (size_t)-1UL / sizeof(int) / 2);
49 ok1(error_count == 4);
51 /* Now, check that with TAL_TAKE we free old one on failure. */
52 pi = tal_arr(NULL, int, 100);
54 pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1, 0);
56 ok1(error_count == 1);
57 ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
59 pi = tal_arr(NULL, int, 100);
61 pi = tal_dup(TAL_TAKE, int, pi, 0, (size_t)-1);
63 ok1(error_count == 1);
64 ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
66 pi = tal_arr(NULL, int, 100);
68 pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int),
69 (size_t)-1UL / sizeof(int));
71 ok1(error_count == 1);
72 ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
74 pi = tal_arr(NULL, int, 100);
76 /* This will still overflow when tal_hdr is added. */
77 pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int) / 2,
78 (size_t)-1UL / sizeof(int) / 2);
80 ok1(error_count == 1);
81 ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));