Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest/sigaltstack: Use the AT_MINSIGSTKSZ aux vector if available

The SIGSTKSZ constant may not represent enough stack size in some
architectures as the hardware state size grows.

Use getauxval(AT_MINSIGSTKSZ) to increase the stack size.

Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Len Brown <len.brown@intel.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/20210518200320.17239-5-chang.seok.bae@intel.com

authored by

Chang S. Bae and committed by
Borislav Petkov
bdf6c8b8 1c33bb05

+15 -5
+15 -5
tools/testing/selftests/sigaltstack/sas.c
··· 17 17 #include <string.h> 18 18 #include <assert.h> 19 19 #include <errno.h> 20 + #include <sys/auxv.h> 20 21 21 22 #include "../kselftest.h" 22 23 ··· 25 24 #define SS_AUTODISARM (1U << 31) 26 25 #endif 27 26 27 + #ifndef AT_MINSIGSTKSZ 28 + #define AT_MINSIGSTKSZ 51 29 + #endif 30 + 31 + static unsigned int stack_size; 28 32 static void *sstack, *ustack; 29 33 static ucontext_t uc, sc; 30 34 static const char *msg = "[OK]\tStack preserved"; ··· 53 47 #endif 54 48 55 49 if (sp < (unsigned long)sstack || 56 - sp >= (unsigned long)sstack + SIGSTKSZ) { 50 + sp >= (unsigned long)sstack + stack_size) { 57 51 ksft_exit_fail_msg("SP is not on sigaltstack\n"); 58 52 } 59 53 /* put some data on stack. other sighandler will try to overwrite it */ ··· 114 108 stack_t stk; 115 109 int err; 116 110 111 + /* Make sure more than the required minimum. */ 112 + stack_size = getauxval(AT_MINSIGSTKSZ) + SIGSTKSZ; 113 + ksft_print_msg("[NOTE]\tthe stack size is %lu\n", stack_size); 114 + 117 115 ksft_print_header(); 118 116 ksft_set_plan(3); 119 117 ··· 127 117 sigaction(SIGUSR1, &act, NULL); 128 118 act.sa_sigaction = my_usr2; 129 119 sigaction(SIGUSR2, &act, NULL); 130 - sstack = mmap(NULL, SIGSTKSZ, PROT_READ | PROT_WRITE, 120 + sstack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, 131 121 MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); 132 122 if (sstack == MAP_FAILED) { 133 123 ksft_exit_fail_msg("mmap() - %s\n", strerror(errno)); ··· 149 139 } 150 140 151 141 stk.ss_sp = sstack; 152 - stk.ss_size = SIGSTKSZ; 142 + stk.ss_size = stack_size; 153 143 stk.ss_flags = SS_ONSTACK | SS_AUTODISARM; 154 144 err = sigaltstack(&stk, NULL); 155 145 if (err) { ··· 171 161 } 172 162 } 173 163 174 - ustack = mmap(NULL, SIGSTKSZ, PROT_READ | PROT_WRITE, 164 + ustack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, 175 165 MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); 176 166 if (ustack == MAP_FAILED) { 177 167 ksft_exit_fail_msg("mmap() - %s\n", strerror(errno)); ··· 180 170 getcontext(&uc); 181 171 uc.uc_link = NULL; 182 172 uc.uc_stack.ss_sp = ustack; 183 - uc.uc_stack.ss_size = SIGSTKSZ; 173 + uc.uc_stack.ss_size = stack_size; 184 174 makecontext(&uc, switch_fn, 0); 185 175 raise(SIGUSR1); 186 176