1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
/* Copyright (C) 2001-2024 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <sigaltstack-offsets.h>
.section .rodata.str1.1,"aMS",@progbits,1
.type longjmp_msg,@object
longjmp_msg:
.string "longjmp causes uninitialized stack frame"
.size longjmp_msg, .-longjmp_msg
#ifdef PIC
# define LOAD_MSG lea longjmp_msg(%rip), %RDI_LP
#else
# define LOAD_MSG mov $longjmp_msg, %RDI_LP
#endif
#define CHECK_INVALID_LONGJMP \
cmp %R8_LP, %RSP_LP; \
jbe .Lok; \
/* Save function parameters. */ \
movq %rdi, %r10; \
cfi_register (%rdi, %r10); \
movl %esi, %ebx; \
cfi_register (%rsi, %rbx); \
xorl %edi, %edi; \
lea -sizeSS(%rsp), %RSI_LP; \
movl $__NR_sigaltstack, %eax; \
syscall; \
/* Without working sigaltstack we cannot perform the test. */ \
testl %eax, %eax; \
jne .Lok2; \
testl $1, (-sizeSS + oSS_FLAGS)(%rsp); \
jz .Lfail; \
mov (-sizeSS + oSS_SP)(%rsp), %RAX_LP; \
add (-sizeSS + oSS_SIZE)(%rsp), %RAX_LP; \
sub %R8_LP, %RAX_LP; \
cmp (-sizeSS + oSS_SIZE)(%rsp), %RAX_LP; \
jae .Lok2; \
.Lfail: \
sub $8, %RSP_LP; \
cfi_remember_state; \
cfi_def_cfa_offset(16); \
LOAD_MSG; \
call HIDDEN_JUMPTARGET(__fortify_fail); \
cfi_restore_state; \
.p2align 3, 5; \
.Lok2: \
movq %r10, %rdi; \
cfi_restore (%rdi); \
movl %ebx, %esi; \
cfi_restore (%rsi); \
.Lok:
#define __longjmp ____longjmp_chk
#include <__longjmp.S>
|