]> git.ozlabs.org Git - ccan/blob - ccan/tal/test/run-overflow.c
989fcd2aba2eee5e9339e06abdd3be4eb7549644
[ccan] / ccan / tal / test / run-overflow.c
1 #include <ccan/tal/tal.h>
2 #include <ccan/tal/tal.c>
3 #include <ccan/tap/tap.h>
4
5 static int error_count;
6
7 static void my_error(const char *msg)
8 {
9         error_count++;
10 }
11
12 int main(void)
13 {
14         void *p;
15         int *pi, *origpi;
16
17         plan_tests(26);
18
19         tal_set_backend(NULL, NULL, NULL, my_error);
20
21         p = tal_arr(NULL, int, (size_t)-1);
22         ok1(!p);
23         ok1(error_count == 1);
24
25         p = tal_arr(NULL, char, (size_t)-2);
26         ok1(!p);
27         ok1(error_count == 2);
28
29         /* Now try overflow cases for tal_dup. */
30         error_count = 0;
31         origpi = tal_arr(NULL, int, 100);
32         ok1(origpi);
33         ok1(error_count == 0);
34         pi = tal_dup(NULL, int, origpi, (size_t)-1, 0);
35         ok1(!pi);
36         ok1(error_count == 1);
37         pi = tal_dup(NULL, int, origpi, 0, (size_t)-1);
38         ok1(!pi);
39         ok1(error_count == 2);
40
41         pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int),
42                      (size_t)-1UL / sizeof(int));
43         ok1(!pi);
44         ok1(error_count == 3);
45         /* This will still overflow when tal_hdr is added. */
46         pi = tal_dup(NULL, int, origpi, (size_t)-1UL / sizeof(int) / 2,
47                      (size_t)-1UL / sizeof(int) / 2);
48         ok1(!pi);
49         ok1(error_count == 4);
50         ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
51         tal_free(origpi);
52
53         /* Now, check that with taltk() we free old one on failure. */
54         origpi = tal_arr(NULL, int, 100);
55         error_count = 0;
56         pi = tal_dup(NULL, int, take(origpi), (size_t)-1, 0);
57         ok1(!pi);
58         ok1(error_count == 1);
59
60         origpi = tal_arr(NULL, int, 100);
61         error_count = 0;
62         pi = tal_dup(NULL, int, take(origpi), 0, (size_t)-1);
63         ok1(!pi);
64         ok1(error_count == 1);
65         ok1(!tal_first(NULL));
66
67         origpi = tal_arr(NULL, int, 100);
68         error_count = 0;
69         pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int),
70                      (size_t)-1UL / sizeof(int));
71         ok1(!pi);
72         ok1(error_count == 1);
73         ok1(!tal_first(NULL));
74
75         origpi = tal_arr(NULL, int, 100);
76         error_count = 0;
77         /* This will still overflow when tal_hdr is added. */
78         pi = tal_dup(NULL, int, take(origpi), (size_t)-1UL / sizeof(int) / 2,
79                      (size_t)-1UL / sizeof(int) / 2);
80         ok1(!pi);
81         ok1(error_count == 1);
82         ok1(!tal_first(NULL));
83
84         return exit_status();
85 }