test-malloc-overflow.c revision ba1a5db879b08d2fefcb42160af67853cdfe7687
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2016-2017 Dovecot authors, see the included COPYING file */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic void test_malloc_overflow_multiply(void)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch static const struct {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch for (unsigned int i = 0; i < N_ELEMENTS(tests); i++) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch test_assert_idx(MALLOC_MULTIPLY(tests[i].a, tests[i].b) == tests[i].a * tests[i].b, i);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch test_assert_idx(MALLOC_MULTIPLY(tests[i].b, tests[i].a) == tests[i].b * tests[i].a, i);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch static const struct {
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen unsigned short n = 2;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* check that no compiler warning is given */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch for (unsigned int i = 0; i < N_ELEMENTS(tests); i++) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch test_assert_idx(MALLOC_ADD(tests[i].a, tests[i].b) == tests[i].a + tests[i].b, i);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch test_assert_idx(MALLOC_ADD(tests[i].b, tests[i].a) == tests[i].b + tests[i].a, i);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic enum fatal_test_state fatal_malloc_overflow_multiply(unsigned int *stage)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const struct {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int i;
d295cff1b640240cd198b9c8e963c9116ab95510Timo Sirainen test_expect_fatal_string("memory allocation overflow");
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY((size_t)SIZE_MAX/2, (uint8_t)3));
9a5980c7bb836f69a63082f4699c30596ea4ee74Timo Sirainen i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY((uint8_t)3, (size_t)SIZE_MAX/2));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY(mul_tests[i].a, mul_tests[i].b));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_error("%"PRIuSIZE_T, MALLOC_MULTIPLY(mul_tests[i].b, mul_tests[i].a));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic enum fatal_test_state fatal_malloc_overflow_add(unsigned int *stage)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const struct {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int i;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch test_expect_fatal_string("memory allocation overflow");
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_error("%"PRIuSIZE_T, MALLOC_ADD((size_t)SIZE_MAX, (uint8_t)1));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_error("%"PRIuSIZE_T, MALLOC_ADD((uint8_t)1, (size_t)SIZE_MAX));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_error("%"PRIuSIZE_T, MALLOC_ADD(add_tests[i].a, add_tests[i].b));
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen i_error("%"PRIuSIZE_T, MALLOC_ADD(add_tests[i].b, add_tests[i].a));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschenum fatal_test_state fatal_malloc_overflow(unsigned int stage)