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)
20 tal_set_backend(NULL, NULL, NULL, my_error);
22 p = tal_arr(NULL, int, (size_t)-1);
24 ok1(error_count == 1);
26 p = tal_arr(NULL, char, (size_t)-2);
28 ok1(error_count == 2);
30 /* Now try overflow cases for tal_dup. */
32 origpi = tal_arr(NULL, int, 100);
34 ok1(error_count == 0);
35 pi = tal_dup(NULL, int, origpi, (size_t)-1, 0);
37 ok1(error_count == 1);
38 pi = tal_dup(NULL, int, origpi, 0, (size_t)-1);
40 ok1(error_count == 2);
42 pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int),
43 (size_t)-1UL / sizeof(int));
45 ok1(error_count == 3);
46 /* This will still overflow when tal_hdr is added. */
47 pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int) / 2,
48 (size_t)-1UL / sizeof(int) / 2);
50 ok1(error_count == 4);
51 ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
54 /* Now, check that with taltk() we free old one on failure. */
55 origpi = tal_arr(NULL, int, 100);
57 pi = tal_dup(NULL, int, take(origpi), (size_t)-1, 0);
59 ok1(error_count == 1);
61 origpi = tal_arr(NULL, int, 100);
63 pi = tal_dup(NULL, int, take(origpi), 0, (size_t)-1);
65 ok1(error_count == 1);
66 ok1(!tal_first(NULL));
68 origpi = tal_arr(NULL, int, 100);
70 pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int),
71 (size_t)-1UL / sizeof(int));
73 ok1(error_count == 1);
74 ok1(!tal_first(NULL));
76 origpi = tal_arr(NULL, int, 100);
78 /* This will still overflow when tal_hdr is added. */
79 pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int) / 2,
80 (size_t)-1UL / sizeof(int) / 2);
82 ok1(error_count == 1);
83 ok1(!tal_first(NULL));
85 /* Overflow on expand addition. */
86 cp = tal_arr(p, char, 100);
87 ok1(!tal_expand(&cp, NULL, (size_t)-99UL));
88 ok1(error_count == 2);
91 /* Overflow when multiplied by size */
92 origpi = tal_arr(NULL, int, 100);
93 ok1(!tal_expand(&origpi, NULL, (size_t)-1UL / sizeof(int)));
94 ok1(error_count == 3);