test-malloc-overflow.c revision ad5ece2a07cca5fa033287f70bafdd312e2338a5
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainenstatic void test_malloc_overflow_multiply(void)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen for (unsigned int i = 0; i < N_ELEMENTS(tests); i++) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(MALLOC_MULTIPLY(tests[i].a, tests[i].b) == tests[i].a * tests[i].b, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(MALLOC_MULTIPLY(tests[i].b, tests[i].a) == tests[i].b * tests[i].a, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned short n = 2;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* check that no compiler warning is given */
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen for (unsigned int i = 0; i < N_ELEMENTS(tests); i++) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(MALLOC_ADD(tests[i].a, tests[i].b) == tests[i].a + tests[i].b, i);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen test_assert_idx(MALLOC_ADD(tests[i].b, tests[i].a) == tests[i].b + tests[i].a, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic enum fatal_test_state fatal_malloc_overflow_multiply(unsigned int *stage)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen unsigned int i;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY((size_t)SIZE_MAX/2, (uint8_t)3));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY((uint8_t)3, (size_t)SIZE_MAX/2));
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY(mul_tests[i].a, mul_tests[i].b));
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY(mul_tests[i].b, mul_tests[i].a));
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainenstatic enum fatal_test_state fatal_malloc_overflow_add(unsigned int *stage)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen unsigned int i;
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen i_error("%"PRIuSIZE_T, MALLOC_ADD((size_t)SIZE_MAX, (uint8_t)1));
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen i_error("%"PRIuSIZE_T, MALLOC_ADD((uint8_t)1, (size_t)SIZE_MAX));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_error("%"PRIuSIZE_T, MALLOC_ADD(add_tests[i].a, add_tests[i].b));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_error("%"PRIuSIZE_T, MALLOC_ADD(add_tests[i].b, add_tests[i].a));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenenum fatal_test_state fatal_malloc_overflow(unsigned int stage)
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen state = fatal_malloc_overflow_multiply(&stage);
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen /* individual checks */