1 #include <ccan/tal/talloc/talloc.h>
2 #include <ccan/tal/talloc/talloc.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);
21 talloc_enable_null_tracking_no_autofree();
23 p = tal_arr(NULL, int, (size_t)-1);
25 ok1(error_count == 1);
27 p = tal_arr(NULL, char, (size_t)-2);
29 ok1(error_count == 2);
31 /* Now try overflow cases for tal_dup. */
33 origpi = tal_arr(NULL, int, 100);
35 ok1(error_count == 0);
36 pi = tal_dup(NULL, int, origpi, (size_t)-1, 0);
38 ok1(error_count == 1);
39 pi = tal_dup(NULL, int, origpi, 0, (size_t)-1);
41 ok1(error_count == 2);
43 pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int),
44 (size_t)-1UL / sizeof(int));
46 ok1(error_count == 3);
47 /* This will still overflow when tal_hdr is added. */
48 pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int) / 2,
49 (size_t)-1UL / sizeof(int) / 2);
51 ok1(error_count == 4);
52 ok1(talloc_total_blocks(NULL) == 2);
55 /* Now, check that with taltk() we free old one on failure. */
56 origpi = tal_arr(NULL, int, 100);
58 pi = tal_dup(NULL, int, take(origpi), (size_t)-1, 0);
60 ok1(error_count == 1);
62 origpi = tal_arr(NULL, int, 100);
64 pi = tal_dup(NULL, int, take(origpi), 0, (size_t)-1);
66 ok1(error_count == 1);
67 ok1(talloc_total_blocks(NULL) == 1);
69 origpi = tal_arr(NULL, int, 100);
71 pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int),
72 (size_t)-1UL / sizeof(int));
74 ok1(error_count == 1);
75 ok1(talloc_total_blocks(NULL) == 1);
77 origpi = tal_arr(NULL, int, 100);
79 /* This will still overflow when tal_hdr is added. */
80 pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int) / 2,
81 (size_t)-1UL / sizeof(int) / 2);
83 ok1(error_count == 1);
84 ok1(talloc_total_blocks(NULL) == 1);
86 /* Overflow on expand addition. */
87 cp = tal_arr(p, char, 100);
88 ok1(!tal_expand(&cp, NULL, (size_t)-99UL));
89 ok1(error_count == 2);
92 /* Overflow when multiplied by size */
93 origpi = tal_arr(NULL, int, 100);
94 ok1(!tal_expand(&origpi, NULL, (size_t)-1UL / sizeof(int)));
95 ok1(error_count == 3);
98 talloc_disable_null_tracking();