xref: /freebsd/sys/contrib/libsodium/test/default/sodium_utils3.c (revision 0ac341f145426f1f0d00b64d35f19fada2be635c)
1*0ac341f1SConrad Meyer 
2*0ac341f1SConrad Meyer #include <stdlib.h>
3*0ac341f1SConrad Meyer #include <sys/types.h>
4*0ac341f1SConrad Meyer 
5*0ac341f1SConrad Meyer #include <limits.h>
6*0ac341f1SConrad Meyer #include <signal.h>
7*0ac341f1SConrad Meyer 
8*0ac341f1SConrad Meyer #define TEST_NAME "sodium_utils3"
9*0ac341f1SConrad Meyer #include "cmptest.h"
10*0ac341f1SConrad Meyer 
11*0ac341f1SConrad Meyer #ifdef __SANITIZE_ADDRESS__
12*0ac341f1SConrad Meyer # warning The sodium_utils3 test is expected to fail with address sanitizer
13*0ac341f1SConrad Meyer #endif
14*0ac341f1SConrad Meyer 
15*0ac341f1SConrad Meyer __attribute__((noreturn)) static void
16*0ac341f1SConrad Meyer segv_handler(int sig)
17*0ac341f1SConrad Meyer {
18*0ac341f1SConrad Meyer     (void) sig;
19*0ac341f1SConrad Meyer 
20*0ac341f1SConrad Meyer     printf("Intentional segfault / bus error caught\n");
21*0ac341f1SConrad Meyer     printf("OK\n");
22*0ac341f1SConrad Meyer #ifdef SIGSEGV
23*0ac341f1SConrad Meyer     signal(SIGSEGV, SIG_DFL);
24*0ac341f1SConrad Meyer #endif
25*0ac341f1SConrad Meyer #ifdef SIGBUS
26*0ac341f1SConrad Meyer     signal(SIGBUS, SIG_DFL);
27*0ac341f1SConrad Meyer #endif
28*0ac341f1SConrad Meyer #ifdef SIGABRT
29*0ac341f1SConrad Meyer     signal(SIGABRT, SIG_DFL);
30*0ac341f1SConrad Meyer #endif
31*0ac341f1SConrad Meyer     exit(0);
32*0ac341f1SConrad Meyer }
33*0ac341f1SConrad Meyer 
34*0ac341f1SConrad Meyer int
35*0ac341f1SConrad Meyer main(void)
36*0ac341f1SConrad Meyer {
37*0ac341f1SConrad Meyer     void * buf;
38*0ac341f1SConrad Meyer     size_t size;
39*0ac341f1SConrad Meyer 
40*0ac341f1SConrad Meyer #ifdef SIGSEGV
41*0ac341f1SConrad Meyer     signal(SIGSEGV, segv_handler);
42*0ac341f1SConrad Meyer #endif
43*0ac341f1SConrad Meyer #ifdef SIGBUS
44*0ac341f1SConrad Meyer     signal(SIGBUS, segv_handler);
45*0ac341f1SConrad Meyer #endif
46*0ac341f1SConrad Meyer #ifdef SIGABRT
47*0ac341f1SConrad Meyer     signal(SIGABRT, segv_handler);
48*0ac341f1SConrad Meyer #endif
49*0ac341f1SConrad Meyer     size = 1U + randombytes_uniform(100000U);
50*0ac341f1SConrad Meyer     buf  = sodium_malloc(size);
51*0ac341f1SConrad Meyer     assert(buf != NULL);
52*0ac341f1SConrad Meyer 
53*0ac341f1SConrad Meyer /* old versions of asan emit a warning because they don't support mlock*() */
54*0ac341f1SConrad Meyer #ifndef __SANITIZE_ADDRESS__
55*0ac341f1SConrad Meyer     sodium_mprotect_noaccess(buf);
56*0ac341f1SConrad Meyer     sodium_mprotect_readwrite(buf);
57*0ac341f1SConrad Meyer #endif
58*0ac341f1SConrad Meyer 
59*0ac341f1SConrad Meyer #if defined(HAVE_CATCHABLE_SEGV) && !defined(__EMSCRIPTEN__) && !defined(__SANITIZE_ADDRESS__)
60*0ac341f1SConrad Meyer     sodium_memzero(((unsigned char *) buf) - 8, 8U);
61*0ac341f1SConrad Meyer     sodium_mprotect_readonly(buf);
62*0ac341f1SConrad Meyer     sodium_free(buf);
63*0ac341f1SConrad Meyer     printf("Underflow not caught\n");
64*0ac341f1SConrad Meyer #else
65*0ac341f1SConrad Meyer     segv_handler(0);
66*0ac341f1SConrad Meyer #endif
67*0ac341f1SConrad Meyer     return 0;
68*0ac341f1SConrad Meyer }
69