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" ?