X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Ftest%2Frun-overflow.c;h=6c4ccff4379dc97d4be669d8fe2c5224086c5618;hp=dedeba3d112ee2195c07a512b05338f1438a3f25;hb=84b29c907c7608a024f65c4ef6803a1f5bb80ccd;hpb=7ca46909f86e8bbad4e4bb19cac1a75d4ebf3df6;ds=sidebyside diff --git a/ccan/tal/test/run-overflow.c b/ccan/tal/test/run-overflow.c index dedeba3d..6c4ccff4 100644 --- a/ccan/tal/test/run-overflow.c +++ b/ccan/tal/test/run-overflow.c @@ -7,14 +7,14 @@ static int error_count; static void my_error(const char *msg) { error_count++; - ok1(strstr(msg, "overflow")); } int main(void) { void *p; + int *pi, *origpi; - plan_tests(6); + plan_tests(26); tal_set_backend(NULL, NULL, NULL, my_error); @@ -25,5 +25,60 @@ int main(void) p = tal_arr(NULL, char, (size_t)-2); ok1(!p); ok1(error_count == 2); + + /* Now try overflow cases for tal_dup. */ + error_count = 0; + pi = origpi = tal_arr(NULL, int, 100); + ok1(pi); + ok1(error_count == 0); + pi = tal_dup(NULL, int, pi, (size_t)-1, 0); + ok1(!pi); + ok1(error_count == 1); + pi = tal_dup(NULL, int, pi, 0, (size_t)-1); + ok1(!pi); + ok1(error_count == 2); + + pi = tal_dup(NULL, int, pi, (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, + (size_t)-1UL / sizeof(int) / 2); + ok1(!pi); + ok1(error_count == 4); + + /* Now, check that with TAL_TAKE we free old one on failure. */ + pi = tal_arr(NULL, int, 100); + error_count = 0; + pi = tal_dup(TAL_TAKE, int, pi, (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); + error_count = 0; + pi = tal_dup(TAL_TAKE, int, pi, 0, (size_t)-1); + ok1(!pi); + ok1(error_count == 1); + ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi)); + + pi = tal_arr(NULL, int, 100); + error_count = 0; + pi = tal_dup(TAL_TAKE, int, pi, (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)); + + pi = 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, + (size_t)-1UL / sizeof(int) / 2); + ok1(!pi); + ok1(error_count == 1); + ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi)); + return exit_status(); }