There is:

#define __longjmp ____longjmp_chk
#define CHECK_SP(sp)                                                    \
  do { \
    register unsigned long this_sp asm ("r30");                         \
    /* The stack grows up, therefore frames that were created and then  \
       destroyed must all have stack values higher than ours. */       \
    if ((unsigned long) (sp) > this_sp)                                 \
{ \
        stack_t oss;                                                    \
        int result = INTERNAL_SYSCALL_CALL (sigaltstack, NULL, &oss);\
        /* If we aren't using an alternate stack then we have already   \
           shown that we are jumping to a frame that doesn't exist so   \
           error out. If we are using an alternate stack we must prove  \
           that we are jumping *out* of the alternate stack. Note that  \
           the check for that is the same as that for _STACK_GROWS_UP   \
           as for _STACK_GROWS_DOWN. */                                \
        if (!INTERNAL_SYSCALL_ERROR_P (result)                          \
            && ((oss.ss_flags & SS_ONSTACK) == 0                        \
                || ((unsigned long) oss.ss_sp + oss.ss_size             \
                    - (unsigned long) (sp)) < oss.ss_size))             \
          __fortify_fail ("longjmp causes uninitialized stack frame");  \
} \
  } while (0)


when running strace I see:

pid 23270] sigaltstack(NULL, {ss_sp=NULL, ss_flags=SS_DISABLE, ss_size=0}) = 0 [pid 23270] writev(2, [{iov_base="*** ", iov_len=4}, {iov_base="longjmp causes uninitialized sta "..., iov_len=40}, {iov_base=" ***: terminated\n", iov_len=17}], 3*** longjmp causes uninitializ
ed stack frame ***: terminated

maybe the check should be avoided if "ss_flags=SS_DISABLE" ?


Reply via email to