mirror of
https://github.com/ThrowTheSwitch/Unity.git
synced 2026-01-23 00:15:58 +01:00
Check for writes to guard space on malloc'd buffers in Fixture
There was already some space reserved as a guard, added check for writes before the beginning of the buffer. Did not change the 'overrun' message. Underrun buffer writes are likely to be a more rare case.
This commit is contained in:
@@ -166,7 +166,7 @@ static unsigned int heap_index;
|
||||
typedef struct GuardBytes
|
||||
{
|
||||
size_t size;
|
||||
char guard_space[4];
|
||||
size_t guard_space;
|
||||
} Guard;
|
||||
|
||||
|
||||
@@ -202,6 +202,7 @@ void* unity_malloc(size_t size)
|
||||
if (guard == NULL) return NULL;
|
||||
malloc_count++;
|
||||
guard->size = size;
|
||||
guard->guard_space = 0;
|
||||
mem = (char*)&(guard[1]);
|
||||
memcpy(&mem[size], end, sizeof(end));
|
||||
|
||||
@@ -214,7 +215,7 @@ static int isOverrun(void* mem)
|
||||
char* memAsChar = (char*)mem;
|
||||
guard--;
|
||||
|
||||
return strcmp(&memAsChar[guard->size], end) != 0;
|
||||
return guard->guard_space != 0 || strcmp(&memAsChar[guard->size], end) != 0;
|
||||
}
|
||||
|
||||
static void release_memory(void* mem)
|
||||
|
||||
@@ -381,6 +381,47 @@ TEST(LeakDetection, BufferOverrunFoundDuringRealloc)
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST(LeakDetection, BufferGuardWriteFoundDuringFree)
|
||||
{
|
||||
#ifndef USING_OUTPUT_SPY
|
||||
UNITY_PRINT_EOL();
|
||||
TEST_IGNORE();
|
||||
#else
|
||||
void* m = malloc(10);
|
||||
TEST_ASSERT_NOT_NULL(m);
|
||||
char* s = (char*)m;
|
||||
s[-1] = (char)0x00; // Will not detect 0
|
||||
s[-2] = (char)0x01;
|
||||
UnityOutputCharSpy_Enable(1);
|
||||
EXPECT_ABORT_BEGIN
|
||||
free(m);
|
||||
EXPECT_ABORT_END
|
||||
UnityOutputCharSpy_Enable(0);
|
||||
Unity.CurrentTestFailed = 0;
|
||||
CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during free()"));
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST(LeakDetection, BufferGuardWriteFoundDuringRealloc)
|
||||
{
|
||||
#ifndef USING_OUTPUT_SPY
|
||||
UNITY_PRINT_EOL();
|
||||
TEST_IGNORE();
|
||||
#else
|
||||
void* m = malloc(10);
|
||||
TEST_ASSERT_NOT_NULL(m);
|
||||
char* s = (char*)m;
|
||||
s[-1] = (char)0x0A;
|
||||
UnityOutputCharSpy_Enable(1);
|
||||
EXPECT_ABORT_BEGIN
|
||||
m = realloc(m, 100);
|
||||
EXPECT_ABORT_END
|
||||
UnityOutputCharSpy_Enable(0);
|
||||
Unity.CurrentTestFailed = 0;
|
||||
CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during realloc()"));
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_GROUP(InternalMalloc);
|
||||
|
||||
TEST_SETUP(InternalMalloc) { }
|
||||
|
||||
@@ -40,6 +40,8 @@ TEST_GROUP_RUNNER(LeakDetection)
|
||||
RUN_TEST_CASE(LeakDetection, DetectsLeak);
|
||||
RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringFree);
|
||||
RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringRealloc);
|
||||
RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringFree);
|
||||
RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringRealloc);
|
||||
}
|
||||
|
||||
TEST_GROUP_RUNNER(InternalMalloc)
|
||||
|
||||
Reference in New Issue
Block a user