[CRIU] [PATCH] arch/x86: push correct eip on the stack before lretq
Andrei Vagin
avagin at gmail.com
Tue Sep 10 16:50:58 MSK 2019
Right now we use pushq, but it pushes sign-extended value, so if the
parasite code is placed higher that 2Gb, we will see something like
this:
0xf7efd5b0: pushq $0x23
0xf7efd5b2: pushq $0xfffffffff7efd5b9
=> 0xf7efd5b7: lretq
Actually we want to push 0xf7efd5b9 instead of 0xfffffffff7efd5b9.
Fixes: #398
Cc: Dmitry Safonov <dima at arista.com>
Cc: Cyrill Gorcunov <gorcunov at gmail.com>
Signed-off-by: Andrei Vagin <avagin at gmail.com>
---
compel/arch/x86/src/lib/include/uapi/asm/sigframe.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h b/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h
index 51ca023f7..486c0c8e0 100644
--- a/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h
+++ b/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h
@@ -194,7 +194,9 @@ void rt_sigframe_erase_sigset(struct rt_sigframe *sigframe)
#define ARCH_RT_SIGRETURN_COMPAT(new_sp) \
asm volatile( \
"pushq $"__stringify(USER32_CS)" \n" \
- "pushq $1f \n" \
+ "xor %%rax, %%rax \n" \
+ "movl $1f, %%eax \n" \
+ "pushq %%rax \n" \
"lretq \n" \
"1: \n" \
".code32 \n" \
--
2.21.0
More information about the CRIU
mailing list