Fix T53544: Crash drawing scene w/o world
[blender.git] / tests / gtests / guardedalloc / guardedalloc_overflow_test.cc
1 /* Apache License, Version 2.0 */
2
3 #include "testing/testing.h"
4
5 #include "MEM_guardedalloc.h"
6
7 /* We expect to abort on integer overflow, to prevent possible exploits. */
8 #ifdef _WIN32
9 #define ABORT_PREDICATE ::testing::ExitedWithCode(3)
10 #else
11 #define ABORT_PREDICATE ::testing::KilledBySignal(SIGABRT)
12 #endif
13
14 namespace {
15
16 void MallocArray(size_t len, size_t size)
17 {
18         void *mem = MEM_malloc_arrayN(len, size, "MallocArray");
19         if (mem) {
20                 MEM_freeN(mem);
21         }
22 }
23
24 void CallocArray(size_t len, size_t size)
25 {
26         void *mem = MEM_calloc_arrayN(len, size, "CallocArray");
27         if (mem) {
28                 MEM_freeN(mem);
29         }
30 }
31
32 }  // namespace
33
34 TEST(guardedalloc, LockfreeIntegerOverflow)
35 {
36         MallocArray(1, SIZE_MAX);
37         CallocArray(SIZE_MAX, 1);
38         MallocArray(SIZE_MAX / 2, 2);
39         CallocArray(SIZE_MAX / 1234567, 1234567);
40
41         EXPECT_EXIT(MallocArray(SIZE_MAX, 2), ABORT_PREDICATE, "");
42         EXPECT_EXIT(CallocArray(7, SIZE_MAX), ABORT_PREDICATE, "");
43         EXPECT_EXIT(MallocArray(SIZE_MAX, 12345567), ABORT_PREDICATE, "");
44         EXPECT_EXIT(CallocArray(SIZE_MAX, SIZE_MAX), ABORT_PREDICATE, "");
45 }
46
47 TEST(guardedalloc, GuardedIntegerOverflow)
48 {
49         MEM_use_guarded_allocator();
50
51         MallocArray(1, SIZE_MAX);
52         CallocArray(SIZE_MAX, 1);
53         MallocArray(SIZE_MAX / 2, 2);
54         CallocArray(SIZE_MAX / 1234567, 1234567);
55
56         EXPECT_EXIT(MallocArray(SIZE_MAX, 2), ABORT_PREDICATE, "");
57         EXPECT_EXIT(CallocArray(7, SIZE_MAX), ABORT_PREDICATE, "");
58         EXPECT_EXIT(MallocArray(SIZE_MAX, 12345567), ABORT_PREDICATE, "");
59         EXPECT_EXIT(CallocArray(SIZE_MAX, SIZE_MAX), ABORT_PREDICATE, "");
60 }