4be9e9e7fe
Thanks to Basile Starynkevitch for the suggestion and initial patch. Thanks to Jonathan Landis and Deron Meranda for showing how this can be utilized for implementing secure memory operations.
85 lines
1.5 KiB
C
85 lines
1.5 KiB
C
#include <string.h>
|
|
#include <jansson.h>
|
|
|
|
#include "util.h"
|
|
|
|
static int malloc_called = 0;
|
|
static int free_called = 0;
|
|
|
|
/* helper */
|
|
static void create_and_free_complex_object()
|
|
{
|
|
json_t *obj;
|
|
|
|
obj = json_pack("{s:i,s:n,s:b,s:b,s:{s:s},s:[i,i,i]",
|
|
"foo", 42,
|
|
"bar",
|
|
"baz", 1,
|
|
"qux", 0,
|
|
"alice", "bar", "baz",
|
|
"bob", 9, 8, 7);
|
|
|
|
json_decref(obj);
|
|
}
|
|
|
|
static void *my_malloc(size_t size)
|
|
{
|
|
malloc_called += 1;
|
|
return malloc(size);
|
|
}
|
|
|
|
static void my_free(void *ptr)
|
|
{
|
|
free_called += 1;
|
|
free(ptr);
|
|
}
|
|
|
|
static void test_simple()
|
|
{
|
|
json_set_alloc_funcs(my_malloc, my_free);
|
|
create_and_free_complex_object();
|
|
|
|
if(malloc_called != 27 || free_called != 27)
|
|
fail("Custom allocation failed");
|
|
}
|
|
|
|
|
|
/*
|
|
Test the secure memory functions code given in the API reference
|
|
documentation, but by using plain memset instead of
|
|
guaranteed_memset().
|
|
*/
|
|
|
|
static void *secure_malloc(size_t size)
|
|
{
|
|
/* Store the memory area size in the beginning of the block */
|
|
void *ptr = malloc(size + 8);
|
|
*((size_t *)ptr) = size;
|
|
return ptr + 8;
|
|
}
|
|
|
|
static void secure_free(void *ptr)
|
|
{
|
|
size_t size;
|
|
|
|
ptr -= 8;
|
|
size = *((size_t *)ptr);
|
|
|
|
/*guaranteed_*/memset(ptr, 0, size);
|
|
free(ptr);
|
|
}
|
|
|
|
static void test_secure_funcs(void)
|
|
{
|
|
json_set_alloc_funcs(secure_malloc, secure_free);
|
|
create_and_free_complex_object();
|
|
}
|
|
|
|
int main()
|
|
{
|
|
test_simple();
|
|
test_secure_funcs();
|
|
|
|
return 0;
|
|
}
|