quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

test_memory.c (1640B)


      1 /**
      2  * \file memory.c
      3  *
      4  * \brief   Helper functions related to testing memory management.
      5  */
      6 
      7 /*
      8  *  Copyright The Mbed TLS Contributors
      9  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
     10  */
     11 
     12 #include <test/helpers.h>
     13 #include <test/macros.h>
     14 #include <test/memory.h>
     15 
     16 #if defined(MBEDTLS_TEST_MEMORY_CAN_POISON)
     17 #include <sanitizer/asan_interface.h>
     18 #include <stdint.h>
     19 #endif
     20 
     21 #if defined(MBEDTLS_TEST_MEMORY_CAN_POISON)
     22 
     23 _Thread_local unsigned int mbedtls_test_memory_poisoning_count = 0;
     24 
     25 static void align_for_asan(const unsigned char **p_ptr, size_t *p_size)
     26 {
     27     uintptr_t start = (uintptr_t) *p_ptr;
     28     uintptr_t end = start + (uintptr_t) *p_size;
     29     /* ASan can only poison regions with 8-byte alignment, and only poisons a
     30      * region if it's fully within the requested range. We want to poison the
     31      * whole requested region and don't mind a few extra bytes. Therefore,
     32      * align start down to an 8-byte boundary, and end up to an 8-byte
     33      * boundary. */
     34     start = start & ~(uintptr_t) 7;
     35     end = (end + 7) & ~(uintptr_t) 7;
     36     *p_ptr = (const unsigned char *) start;
     37     *p_size = end - start;
     38 }
     39 
     40 void mbedtls_test_memory_poison(const unsigned char *ptr, size_t size)
     41 {
     42     if (mbedtls_test_memory_poisoning_count == 0) {
     43         return;
     44     }
     45     if (size == 0) {
     46         return;
     47     }
     48     align_for_asan(&ptr, &size);
     49     __asan_poison_memory_region(ptr, size);
     50 }
     51 
     52 void mbedtls_test_memory_unpoison(const unsigned char *ptr, size_t size)
     53 {
     54     if (size == 0) {
     55         return;
     56     }
     57     align_for_asan(&ptr, &size);
     58     __asan_unpoison_memory_region(ptr, size);
     59 }
     60 #endif /* Memory poisoning */