xref: /aosp_15_r20/external/nanopb-c/tests/common/malloc_wrappers.c (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
1*c8d645caSAndroid Build Coastguard Worker #include "malloc_wrappers.h"
2*c8d645caSAndroid Build Coastguard Worker #include <stdint.h>
3*c8d645caSAndroid Build Coastguard Worker #include <assert.h>
4*c8d645caSAndroid Build Coastguard Worker #include <string.h>
5*c8d645caSAndroid Build Coastguard Worker 
6*c8d645caSAndroid Build Coastguard Worker static size_t alloc_count = 0;
7*c8d645caSAndroid Build Coastguard Worker 
8*c8d645caSAndroid Build Coastguard Worker /* Allocate memory and place check values before and after. */
malloc_with_check(size_t size)9*c8d645caSAndroid Build Coastguard Worker void* malloc_with_check(size_t size)
10*c8d645caSAndroid Build Coastguard Worker {
11*c8d645caSAndroid Build Coastguard Worker     size_t size32 = (size + 3) / 4 + 3;
12*c8d645caSAndroid Build Coastguard Worker     uint32_t *buf = malloc(size32 * sizeof(uint32_t));
13*c8d645caSAndroid Build Coastguard Worker     buf[0] = size32;
14*c8d645caSAndroid Build Coastguard Worker     buf[1] = 0xDEADBEEF;
15*c8d645caSAndroid Build Coastguard Worker     buf[size32 - 1] = 0xBADBAD;
16*c8d645caSAndroid Build Coastguard Worker     return buf + 2;
17*c8d645caSAndroid Build Coastguard Worker }
18*c8d645caSAndroid Build Coastguard Worker 
19*c8d645caSAndroid Build Coastguard Worker /* Free memory allocated with malloc_with_check() and do the checks. */
free_with_check(void * mem)20*c8d645caSAndroid Build Coastguard Worker void free_with_check(void *mem)
21*c8d645caSAndroid Build Coastguard Worker {
22*c8d645caSAndroid Build Coastguard Worker     uint32_t *buf = (uint32_t*)mem - 2;
23*c8d645caSAndroid Build Coastguard Worker     assert(buf[1] == 0xDEADBEEF);
24*c8d645caSAndroid Build Coastguard Worker     assert(buf[buf[0] - 1] == 0xBADBAD);
25*c8d645caSAndroid Build Coastguard Worker     free(buf);
26*c8d645caSAndroid Build Coastguard Worker }
27*c8d645caSAndroid Build Coastguard Worker 
28*c8d645caSAndroid Build Coastguard Worker /* Track memory usage */
counting_realloc(void * ptr,size_t size)29*c8d645caSAndroid Build Coastguard Worker void* counting_realloc(void *ptr, size_t size)
30*c8d645caSAndroid Build Coastguard Worker {
31*c8d645caSAndroid Build Coastguard Worker     /* Don't allocate crazy amounts of RAM when fuzzing */
32*c8d645caSAndroid Build Coastguard Worker     if (size > 1000000)
33*c8d645caSAndroid Build Coastguard Worker         return NULL;
34*c8d645caSAndroid Build Coastguard Worker 
35*c8d645caSAndroid Build Coastguard Worker     if (!ptr && size)
36*c8d645caSAndroid Build Coastguard Worker         alloc_count++;
37*c8d645caSAndroid Build Coastguard Worker 
38*c8d645caSAndroid Build Coastguard Worker     return realloc(ptr, size);
39*c8d645caSAndroid Build Coastguard Worker }
40*c8d645caSAndroid Build Coastguard Worker 
counting_free(void * ptr)41*c8d645caSAndroid Build Coastguard Worker void counting_free(void *ptr)
42*c8d645caSAndroid Build Coastguard Worker {
43*c8d645caSAndroid Build Coastguard Worker     if (ptr)
44*c8d645caSAndroid Build Coastguard Worker     {
45*c8d645caSAndroid Build Coastguard Worker         assert(alloc_count > 0);
46*c8d645caSAndroid Build Coastguard Worker         alloc_count--;
47*c8d645caSAndroid Build Coastguard Worker         free(ptr);
48*c8d645caSAndroid Build Coastguard Worker     }
49*c8d645caSAndroid Build Coastguard Worker }
50*c8d645caSAndroid Build Coastguard Worker 
get_alloc_count()51*c8d645caSAndroid Build Coastguard Worker size_t get_alloc_count()
52*c8d645caSAndroid Build Coastguard Worker {
53*c8d645caSAndroid Build Coastguard Worker     return alloc_count;
54*c8d645caSAndroid Build Coastguard Worker }
55