mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2026-03-27 22:51:11 +01:00
We do not intend to support multithreaded testing in 2.28, so introducing a C11 feature here is an unnecessary burden. Signed-off-by: David Horstmann <david.horstmann@arm.com>
61 lines
1.6 KiB
C
61 lines
1.6 KiB
C
/**
|
|
* \file memory.c
|
|
*
|
|
* \brief Helper functions related to testing memory management.
|
|
*/
|
|
|
|
/*
|
|
* Copyright The Mbed TLS Contributors
|
|
* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
*/
|
|
|
|
#include <test/helpers.h>
|
|
#include <test/macros.h>
|
|
#include <test/memory.h>
|
|
|
|
#if defined(MBEDTLS_TEST_MEMORY_CAN_POISON)
|
|
#include <sanitizer/asan_interface.h>
|
|
#include <stdint.h>
|
|
#endif
|
|
|
|
#if defined(MBEDTLS_TEST_MEMORY_CAN_POISON)
|
|
|
|
unsigned int mbedtls_test_memory_poisoning_count = 0;
|
|
|
|
static void align_for_asan(const unsigned char **p_ptr, size_t *p_size)
|
|
{
|
|
uintptr_t start = (uintptr_t) *p_ptr;
|
|
uintptr_t end = start + (uintptr_t) *p_size;
|
|
/* ASan can only poison regions with 8-byte alignment, and only poisons a
|
|
* region if it's fully within the requested range. We want to poison the
|
|
* whole requested region and don't mind a few extra bytes. Therefore,
|
|
* align start down to an 8-byte boundary, and end up to an 8-byte
|
|
* boundary. */
|
|
start = start & ~(uintptr_t) 7;
|
|
end = (end + 7) & ~(uintptr_t) 7;
|
|
*p_ptr = (const unsigned char *) start;
|
|
*p_size = end - start;
|
|
}
|
|
|
|
void mbedtls_test_memory_poison(const unsigned char *ptr, size_t size)
|
|
{
|
|
if (mbedtls_test_memory_poisoning_count == 0) {
|
|
return;
|
|
}
|
|
if (size == 0) {
|
|
return;
|
|
}
|
|
align_for_asan(&ptr, &size);
|
|
__asan_poison_memory_region(ptr, size);
|
|
}
|
|
|
|
void mbedtls_test_memory_unpoison(const unsigned char *ptr, size_t size)
|
|
{
|
|
if (size == 0) {
|
|
return;
|
|
}
|
|
align_for_asan(&ptr, &size);
|
|
__asan_unpoison_memory_region(ptr, size);
|
|
}
|
|
#endif /* Memory poisoning */
|