[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 21/25] linux-user/sparc: Minor corrections to do_sigreturn
From: |
Richard Henderson |
Subject: |
[PATCH v2 21/25] linux-user/sparc: Minor corrections to do_sigreturn |
Date: |
Sun, 25 Apr 2021 19:53:30 -0700 |
Check that the input sp is 16 byte aligned, not 4.
Do that before the lock_user_struct check.
Validate the saved sp is 8 byte aligned.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/sparc/signal.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index f0f614a3af..0ff57af43d 100644
--- a/linux-user/sparc/signal.c
+++ b/linux-user/sparc/signal.c
@@ -254,7 +254,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
long do_sigreturn(CPUSPARCState *env)
{
abi_ulong sf_addr;
- struct target_signal_frame *sf;
+ struct target_signal_frame *sf = NULL;
abi_ulong pc, npc, ptr;
target_sigset_t set;
sigset_t host_set;
@@ -262,18 +262,21 @@ long do_sigreturn(CPUSPARCState *env)
sf_addr = env->regwptr[WREG_SP];
trace_user_do_sigreturn(env, sf_addr);
- if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1)) {
+
+ /* 1. Make sure we are not getting garbage from the user */
+ if ((sf_addr & 15) || !lock_user_struct(VERIFY_READ, sf, sf_addr, 1)) {
goto segv_and_exit;
}
- /* 1. Make sure we are not getting garbage from the user */
-
- if (sf_addr & 3)
+ /* Make sure stack pointer is aligned. */
+ __get_user(ptr, &sf->regs.u_regs[14]);
+ if (ptr & 7) {
goto segv_and_exit;
+ }
- __get_user(pc, &sf->regs.pc);
+ /* Make sure instruction pointers are aligned. */
+ __get_user(pc, &sf->regs.pc);
__get_user(npc, &sf->regs.npc);
-
if ((pc | npc) & 3) {
goto segv_and_exit;
}
@@ -309,7 +312,7 @@ long do_sigreturn(CPUSPARCState *env)
unlock_user_struct(sf, sf_addr, 0);
return -TARGET_QEMU_ESIGRETURN;
-segv_and_exit:
+ segv_and_exit:
unlock_user_struct(sf, sf_addr, 0);
force_sig(TARGET_SIGSEGV);
return -TARGET_QEMU_ESIGRETURN;
--
2.25.1
- [PATCH v2 15/25] linux-user/sparc: Use target_pt_regs, (continued)
- [PATCH v2 15/25] linux-user/sparc: Use target_pt_regs, Richard Henderson, 2021/04/25
- [PATCH v2 20/25] linux-user/sparc: Clean up setup_frame, Richard Henderson, 2021/04/25
- [PATCH v2 24/25] linux-user/sparc: Implement sparc64 rt signals, Richard Henderson, 2021/04/25
- [PATCH v2 09/25] linux-user/sparc: Merge sparc64 target_structs.h, Richard Henderson, 2021/04/25
- [PATCH v2 25/25] tests/tcg/sparc64: Re-enable linux-test, Richard Henderson, 2021/04/25
- [PATCH v2 12/25] linux-user/sparc: Remove target_sigcontext as unused, Richard Henderson, 2021/04/25
- [PATCH v2 08/25] linux-user/sparc: Merge sparc64 target_elf.h, Richard Henderson, 2021/04/25
- [PATCH v2 18/25] linux-user/sparc: Save and restore fpu in signal frame, Richard Henderson, 2021/04/25
- [PATCH v2 19/25] linux-user/sparc: Add rwin_save to signal frame, Richard Henderson, 2021/04/25
- [PATCH v2 23/25] linux-user/sparc: Implement sparc32 rt signals, Richard Henderson, 2021/04/25
- [PATCH v2 21/25] linux-user/sparc: Minor corrections to do_sigreturn,
Richard Henderson <=
- Re: [PATCH v2 00/25] linux-user/sparc: Implement rt signals, Richard Henderson, 2021/04/25