(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
s390/
s390-32/
____longjmp_chk.c
       1  /* Copyright (C) 2009-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <errno.h>
      19  #include <sysdep.h>
      20  #include <setjmp.h>
      21  #include <bits/setjmp.h>
      22  #include <stdlib.h>
      23  #include <unistd.h>
      24  #include <stdio.h>
      25  #include <stdint.h>
      26  #include <signal.h>
      27  #include <sys/syscall.h>
      28  
      29  #define __longjmp ____longjmp_chk
      30  
      31  #define CHECK_SP(env, guard) \
      32    do									\
      33      {									\
      34        uintptr_t cur_sp;							\
      35        uintptr_t new_sp = env->__gregs[9];				\
      36        __asm__ ("lr %0, %%r15" : "=r" (cur_sp));				\
      37        new_sp ^= guard;							\
      38        if (new_sp < cur_sp)						\
      39  	{								\
      40  	  stack_t oss;							\
      41  	  int res = INTERNAL_SYSCALL_CALL (sigaltstack, NULL, &oss);	\
      42  	  if (!INTERNAL_SYSCALL_ERROR_P (res))				\
      43  	    {								\
      44  	      if ((oss.ss_flags & SS_ONSTACK) == 0			\
      45  		  || ((uintptr_t) (oss.ss_sp + oss.ss_size) - new_sp	\
      46  		      < oss.ss_size))					\
      47  		__fortify_fail ("longjmp causes uninitialized stack frame");\
      48  	    }								\
      49  	}								\
      50      } while (0)
      51  
      52  #include "__longjmp.c"