2018-01-14 20:53:32 +00:00
|
|
|
/* Apache License, Version 2.0 */
|
|
|
|
|
|
|
|
#include "testing/testing.h"
|
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
/* We expect to abort on integer overflow, to prevent possible exploits. */
|
|
|
|
#ifdef _WIN32
|
2019-04-17 04:17:24 +00:00
|
|
|
# define ABORT_PREDICATE ::testing::ExitedWithCode(3)
|
2018-01-14 20:53:32 +00:00
|
|
|
#else
|
2019-04-17 04:17:24 +00:00
|
|
|
# define ABORT_PREDICATE ::testing::KilledBySignal(SIGABRT)
|
2018-01-14 20:53:32 +00:00
|
|
|
#endif
|
|
|
|
|
2020-08-12 10:15:01 +00:00
|
|
|
#if defined(__GNUC__) && !defined(__clang__)
|
2020-08-11 03:22:59 +00:00
|
|
|
/* Disable since it's the purpose of this test. */
|
|
|
|
# pragma GCC diagnostic ignored "-Walloc-size-larger-than="
|
|
|
|
#endif
|
|
|
|
|
2018-01-14 20:53:32 +00:00
|
|
|
namespace {
|
|
|
|
|
|
|
|
void MallocArray(size_t len, size_t size)
|
|
|
|
{
|
2019-04-17 04:17:24 +00:00
|
|
|
void *mem = MEM_malloc_arrayN(len, size, "MallocArray");
|
|
|
|
if (mem) {
|
|
|
|
MEM_freeN(mem);
|
|
|
|
}
|
2018-01-14 20:53:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CallocArray(size_t len, size_t size)
|
|
|
|
{
|
2019-04-17 04:17:24 +00:00
|
|
|
void *mem = MEM_calloc_arrayN(len, size, "CallocArray");
|
|
|
|
if (mem) {
|
|
|
|
MEM_freeN(mem);
|
|
|
|
}
|
2018-01-14 20:53:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
TEST(guardedalloc, LockfreeIntegerOverflow)
|
|
|
|
{
|
2019-04-17 04:17:24 +00:00
|
|
|
MallocArray(1, SIZE_MAX);
|
|
|
|
CallocArray(SIZE_MAX, 1);
|
|
|
|
MallocArray(SIZE_MAX / 2, 2);
|
|
|
|
CallocArray(SIZE_MAX / 1234567, 1234567);
|
|
|
|
|
|
|
|
EXPECT_EXIT(MallocArray(SIZE_MAX, 2), ABORT_PREDICATE, "");
|
|
|
|
EXPECT_EXIT(CallocArray(7, SIZE_MAX), ABORT_PREDICATE, "");
|
|
|
|
EXPECT_EXIT(MallocArray(SIZE_MAX, 12345567), ABORT_PREDICATE, "");
|
|
|
|
EXPECT_EXIT(CallocArray(SIZE_MAX, SIZE_MAX), ABORT_PREDICATE, "");
|
2018-01-14 20:53:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(guardedalloc, GuardedIntegerOverflow)
|
|
|
|
{
|
2019-04-17 04:17:24 +00:00
|
|
|
MEM_use_guarded_allocator();
|
2018-01-14 20:53:32 +00:00
|
|
|
|
2019-04-17 04:17:24 +00:00
|
|
|
MallocArray(1, SIZE_MAX);
|
|
|
|
CallocArray(SIZE_MAX, 1);
|
|
|
|
MallocArray(SIZE_MAX / 2, 2);
|
|
|
|
CallocArray(SIZE_MAX / 1234567, 1234567);
|
2018-01-14 20:53:32 +00:00
|
|
|
|
2019-04-17 04:17:24 +00:00
|
|
|
EXPECT_EXIT(MallocArray(SIZE_MAX, 2), ABORT_PREDICATE, "");
|
|
|
|
EXPECT_EXIT(CallocArray(7, SIZE_MAX), ABORT_PREDICATE, "");
|
|
|
|
EXPECT_EXIT(MallocArray(SIZE_MAX, 12345567), ABORT_PREDICATE, "");
|
|
|
|
EXPECT_EXIT(CallocArray(SIZE_MAX, SIZE_MAX), ABORT_PREDICATE, "");
|
2018-01-14 20:53:32 +00:00
|
|
|
}
|