Safety checks: Add a redzoning feature.
This commit is contained in:
committed by
David Goldblatt
parent
b92c9a1a81
commit
33e1dad680
156
test/unit/safety_check.c
Normal file
156
test/unit/safety_check.c
Normal file
@@ -0,0 +1,156 @@
|
||||
#include "test/jemalloc_test.h"
|
||||
|
||||
#include "jemalloc/internal/safety_check.h"
|
||||
|
||||
/*
|
||||
* Note that we get called through safety_check.sh, which turns on sampling for
|
||||
* everything.
|
||||
*/
|
||||
|
||||
bool fake_abort_called;
|
||||
void fake_abort(const char *message) {
|
||||
(void)message;
|
||||
fake_abort_called = true;
|
||||
}
|
||||
|
||||
TEST_BEGIN(test_malloc_free_overflow) {
|
||||
test_skip_if(!config_prof);
|
||||
test_skip_if(!config_opt_safety_checks);
|
||||
|
||||
safety_check_set_abort(&fake_abort);
|
||||
/* Buffer overflow! */
|
||||
char* ptr = malloc(128);
|
||||
ptr[128] = 0;
|
||||
free(ptr);
|
||||
safety_check_set_abort(NULL);
|
||||
|
||||
assert_b_eq(fake_abort_called, true, "Redzone check didn't fire.");
|
||||
fake_abort_called = false;
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_mallocx_dallocx_overflow) {
|
||||
test_skip_if(!config_prof);
|
||||
test_skip_if(!config_opt_safety_checks);
|
||||
|
||||
safety_check_set_abort(&fake_abort);
|
||||
/* Buffer overflow! */
|
||||
char* ptr = mallocx(128, 0);
|
||||
ptr[128] = 0;
|
||||
dallocx(ptr, 0);
|
||||
safety_check_set_abort(NULL);
|
||||
|
||||
assert_b_eq(fake_abort_called, true, "Redzone check didn't fire.");
|
||||
fake_abort_called = false;
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_malloc_sdallocx_overflow) {
|
||||
test_skip_if(!config_prof);
|
||||
test_skip_if(!config_opt_safety_checks);
|
||||
|
||||
safety_check_set_abort(&fake_abort);
|
||||
/* Buffer overflow! */
|
||||
char* ptr = malloc(128);
|
||||
ptr[128] = 0;
|
||||
sdallocx(ptr, 128, 0);
|
||||
safety_check_set_abort(NULL);
|
||||
|
||||
assert_b_eq(fake_abort_called, true, "Redzone check didn't fire.");
|
||||
fake_abort_called = false;
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_realloc_overflow) {
|
||||
test_skip_if(!config_prof);
|
||||
test_skip_if(!config_opt_safety_checks);
|
||||
|
||||
safety_check_set_abort(&fake_abort);
|
||||
/* Buffer overflow! */
|
||||
char* ptr = malloc(128);
|
||||
ptr[128] = 0;
|
||||
ptr = realloc(ptr, 129);
|
||||
safety_check_set_abort(NULL);
|
||||
free(ptr);
|
||||
|
||||
assert_b_eq(fake_abort_called, true, "Redzone check didn't fire.");
|
||||
fake_abort_called = false;
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_rallocx_overflow) {
|
||||
test_skip_if(!config_prof);
|
||||
test_skip_if(!config_opt_safety_checks);
|
||||
|
||||
safety_check_set_abort(&fake_abort);
|
||||
/* Buffer overflow! */
|
||||
char* ptr = malloc(128);
|
||||
ptr[128] = 0;
|
||||
ptr = rallocx(ptr, 129, 0);
|
||||
safety_check_set_abort(NULL);
|
||||
free(ptr);
|
||||
|
||||
assert_b_eq(fake_abort_called, true, "Redzone check didn't fire.");
|
||||
fake_abort_called = false;
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_xallocx_overflow) {
|
||||
test_skip_if(!config_prof);
|
||||
test_skip_if(!config_opt_safety_checks);
|
||||
|
||||
safety_check_set_abort(&fake_abort);
|
||||
/* Buffer overflow! */
|
||||
char* ptr = malloc(128);
|
||||
ptr[128] = 0;
|
||||
size_t result = xallocx(ptr, 129, 0, 0);
|
||||
assert_zu_eq(result, 128, "");
|
||||
free(ptr);
|
||||
assert_b_eq(fake_abort_called, true, "Redzone check didn't fire.");
|
||||
fake_abort_called = false;
|
||||
safety_check_set_abort(NULL);
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_realloc_no_overflow) {
|
||||
char* ptr = malloc(128);
|
||||
ptr = realloc(ptr, 256);
|
||||
ptr[128] = 0;
|
||||
ptr[255] = 0;
|
||||
free(ptr);
|
||||
|
||||
ptr = malloc(128);
|
||||
ptr = realloc(ptr, 64);
|
||||
ptr[63] = 0;
|
||||
ptr[0] = 0;
|
||||
free(ptr);
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_rallocx_no_overflow) {
|
||||
char* ptr = malloc(128);
|
||||
ptr = rallocx(ptr, 256, 0);
|
||||
ptr[128] = 0;
|
||||
ptr[255] = 0;
|
||||
free(ptr);
|
||||
|
||||
ptr = malloc(128);
|
||||
ptr = rallocx(ptr, 64, 0);
|
||||
ptr[63] = 0;
|
||||
ptr[0] = 0;
|
||||
free(ptr);
|
||||
}
|
||||
TEST_END
|
||||
|
||||
int
|
||||
main(void) {
|
||||
return test(
|
||||
test_malloc_free_overflow,
|
||||
test_mallocx_dallocx_overflow,
|
||||
test_malloc_sdallocx_overflow,
|
||||
test_realloc_overflow,
|
||||
test_rallocx_overflow,
|
||||
test_xallocx_overflow,
|
||||
test_realloc_no_overflow,
|
||||
test_rallocx_no_overflow);
|
||||
}
|
5
test/unit/safety_check.sh
Normal file
5
test/unit/safety_check.sh
Normal file
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ "x${enable_prof}" = "x1" ] ; then
|
||||
export MALLOC_CONF="prof:true,lg_prof_sample:0"
|
||||
fi
|
Reference in New Issue
Block a user