Index: lib/scudo/scudo_allocator.cpp =================================================================== --- lib/scudo/scudo_allocator.cpp +++ lib/scudo/scudo_allocator.cpp @@ -81,9 +81,9 @@ u8 Unused_0_ : 4; // 2nd 8 bytes u64 Offset : 20; // Offset from the beginning of the backend - // allocation to the beginning chunk itself, in - // multiples of MinAlignment. See comment about its - // maximum value and test in init(). + // allocation to the beginning of the chunk itself, + // in multiples of MinAlignment. See comment about + // its maximum value and test in init(). u64 Unused_1_ : 28; u16 Salt : 16; }; Index: lib/scudo/scudo_allocator_secondary.h =================================================================== --- lib/scudo/scudo_allocator_secondary.h +++ lib/scudo/scudo_allocator_secondary.h @@ -42,7 +42,7 @@ uptr Ptr = MapBeg + sizeof(SecondaryHeader); // TODO(kostyak): add a random offset to Ptr. CHECK_GT(Ptr + Size, MapBeg); - CHECK_LT(Ptr + Size, MapEnd); + CHECK_LE(Ptr + Size, MapEnd); SecondaryHeader *Header = getHeader(Ptr); Header->MapBeg = MapBeg - PageSize; Header->MapSize = MapSize + 2 * PageSize; Index: lib/scudo/scudo_utils.cpp =================================================================== --- lib/scudo/scudo_utils.cpp +++ lib/scudo/scudo_utils.cpp @@ -34,8 +34,8 @@ FORMAT(1, 2) void NORETURN dieWithMessage(const char *Format, ...) { - // Our messages are tiny, 128 characters is more than enough. - char Message[128]; + // Our messages are tiny, 256 characters is more than enough. + char Message[256]; va_list Args; va_start(Args, Format); __sanitizer::VSNPrintf(Message, sizeof(Message), Format, Args); Index: test/scudo/malloc.cpp =================================================================== --- test/scudo/malloc.cpp +++ test/scudo/malloc.cpp @@ -8,20 +8,24 @@ #include #include +#include + int main(int argc, char **argv) { void *p; - size_t size = 1U << 8; + std::vector sizes{1, 1 << 5, 1 << 10, 1 << 15, 1 << 20}; - p = malloc(size); - if (!p) - return 1; - memset(p, 'A', size); - free(p); p = malloc(0); if (!p) return 1; free(p); + for (size_t size : sizes) { + p = malloc(size); + if (!p) + return 1; + memset(p, 'A', size); + free(p); + } return 0; } Index: test/scudo/memalign.cpp =================================================================== --- test/scudo/memalign.cpp +++ test/scudo/memalign.cpp @@ -15,17 +15,13 @@ int main(int argc, char **argv) { - void *p; + void *p = nullptr; size_t alignment = 1U << 12; - size_t size = alignment; + size_t size = 1U << 12; assert(argc == 2); + if (!strcmp(argv[1], "valid")) { - p = memalign(alignment, size); - if (!p) - return 1; - free(p); - p = nullptr; posix_memalign(&p, alignment, size); if (!p) return 1; @@ -34,6 +30,19 @@ if (!p) return 1; free(p); + // Tests various combinations of alignment and sizes + for (int i = 4; i < 20; i++) { + alignment = 1U << i; + for (int j = 1; j < 33; j++) { + size = 0x800 * j; + for (int k = 0; k < 3; k++) { + p = memalign(alignment, size - (16 * k)); + if (!p) + return 1; + free(p); + } + } + } } if (!strcmp(argv[1], "invalid")) { p = memalign(alignment - 1, size); Index: test/scudo/realloc.cpp =================================================================== --- test/scudo/realloc.cpp +++ test/scudo/realloc.cpp @@ -20,7 +20,7 @@ { void *p, *old_p; // Those sizes will exercise both allocators (Primary & Secondary). - std::vector sizes{1 << 5, 1 << 17}; + std::vector sizes{1, 1 << 5, 1 << 10, 1 << 15, 1 << 20}; assert(argc == 2); for (size_t size : sizes) { @@ -30,7 +30,8 @@ return 1; size = malloc_usable_size(p); // Our realloc implementation will return the same pointer if the size - // requested is lower or equal to the usable size of the associated chunk. + // requested is lower than or equal to the usable size of the associated + // chunk. p = realloc(p, size - 1); if (p != old_p) return 1;