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