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