From: Greg Kroah-Hartman Date: Mon, 22 Aug 2022 11:44:05 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v4.9.326~49 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c658917f69cf4bd45215f8efd319e31ee243600f;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: nios2-add-force_successful_syscall_return.patch nios2-don-t-leave-nulls-in-sys_call_table.patch nios2-fix-syscall-restart-checks.patch nios2-page-fault-et.al.-are-not-restartable-syscalls.patch nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch nios2-traced-syscall-does-need-to-check-the-syscall-number.patch --- diff --git a/queue-4.9/nios2-add-force_successful_syscall_return.patch b/queue-4.9/nios2-add-force_successful_syscall_return.patch new file mode 100644 index 00000000000..e73fb22bfd4 --- /dev/null +++ b/queue-4.9/nios2-add-force_successful_syscall_return.patch @@ -0,0 +1,61 @@ +From fd0c153daad135d0ec1a53c5dbe6936a724d6ae1 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Mon, 8 Aug 2022 16:09:45 +0100 +Subject: nios2: add force_successful_syscall_return() + +From: Al Viro + +commit fd0c153daad135d0ec1a53c5dbe6936a724d6ae1 upstream. + +If we use the ancient SysV syscall ABI, we'd better have tell the +kernel how to claim that a negative return value is a success. +Use ->orig_r2 for that - it's inaccessible via ptrace, so it's +a fair game for changes and it's normally[*] non-negative on return +from syscall. Set to -1; syscall is not going to be restart-worthy +by definition, so we won't interfere with that use either. + +[*] the only exception is rt_sigreturn(), where we skip the entire +messing with r1/r2 anyway. + +Fixes: 82ed08dd1b0e ("nios2: Exception handling") +Signed-off-by: Al Viro +Signed-off-by: Dinh Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + arch/nios2/include/asm/ptrace.h | 2 ++ + arch/nios2/kernel/entry.S | 6 ++++++ + 2 files changed, 8 insertions(+) + +--- a/arch/nios2/include/asm/ptrace.h ++++ b/arch/nios2/include/asm/ptrace.h +@@ -74,6 +74,8 @@ extern void show_regs(struct pt_regs *); + ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE)\ + - 1) + ++#define force_successful_syscall_return() (current_pt_regs()->orig_r2 = -1) ++ + int do_syscall_trace_enter(void); + void do_syscall_trace_exit(void); + #endif /* __ASSEMBLY__ */ +--- a/arch/nios2/kernel/entry.S ++++ b/arch/nios2/kernel/entry.S +@@ -213,6 +213,9 @@ local_restart: + translate_rc_and_ret: + movi r1, 0 + bge r2, zero, 3f ++ ldw r1, PT_ORIG_R2(sp) ++ addi r1, r1, 1 ++ beq r1, zero, 3f + sub r2, zero, r2 + movi r1, 1 + 3: +@@ -276,6 +279,9 @@ traced_system_call: + translate_rc_and_ret2: + movi r1, 0 + bge r2, zero, 4f ++ ldw r1, PT_ORIG_R2(sp) ++ addi r1, r1, 1 ++ beq r1, zero, 4f + sub r2, zero, r2 + movi r1, 1 + 4: diff --git a/queue-4.9/nios2-don-t-leave-nulls-in-sys_call_table.patch b/queue-4.9/nios2-don-t-leave-nulls-in-sys_call_table.patch new file mode 100644 index 00000000000..0b3d8f73cb8 --- /dev/null +++ b/queue-4.9/nios2-don-t-leave-nulls-in-sys_call_table.patch @@ -0,0 +1,39 @@ +From 45ec746c65097c25e77d24eae8fee0def5b6cc5d Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Mon, 8 Aug 2022 16:06:46 +0100 +Subject: nios2: don't leave NULLs in sys_call_table[] + +From: Al Viro + +commit 45ec746c65097c25e77d24eae8fee0def5b6cc5d upstream. + +fill the gaps in there with sys_ni_syscall, as everyone does... + +Fixes: 82ed08dd1b0e ("nios2: Exception handling") +Signed-off-by: Al Viro +Signed-off-by: Dinh Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + arch/nios2/kernel/entry.S | 1 - + arch/nios2/kernel/syscall_table.c | 1 + + 2 files changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/nios2/kernel/entry.S ++++ b/arch/nios2/kernel/entry.S +@@ -193,7 +193,6 @@ local_restart: + movhi r11, %hiadj(sys_call_table) + add r1, r1, r11 + ldw r1, %lo(sys_call_table)(r1) +- beq r1, r0, ret_invsyscall + + /* Check if we are being traced */ + GET_THREAD_INFO r11 +--- a/arch/nios2/kernel/syscall_table.c ++++ b/arch/nios2/kernel/syscall_table.c +@@ -25,5 +25,6 @@ + #define __SYSCALL(nr, call) [nr] = (call), + + void *sys_call_table[__NR_syscalls] = { ++ [0 ... __NR_syscalls-1] = sys_ni_syscall, + #include + }; diff --git a/queue-4.9/nios2-fix-syscall-restart-checks.patch b/queue-4.9/nios2-fix-syscall-restart-checks.patch new file mode 100644 index 00000000000..58efccaeec6 --- /dev/null +++ b/queue-4.9/nios2-fix-syscall-restart-checks.patch @@ -0,0 +1,35 @@ +From 2d631bd58fe0ea3e3350212e23c9aba1fb606514 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Mon, 8 Aug 2022 16:08:48 +0100 +Subject: nios2: fix syscall restart checks + +From: Al Viro + +commit 2d631bd58fe0ea3e3350212e23c9aba1fb606514 upstream. + +sys_foo() returns -512 (aka -ERESTARTSYS) => do_signal() sees +512 in r2 and 1 in r1. + +sys_foo() returns 512 => do_signal() sees 512 in r2 and 0 in r1. + +The former is restart-worthy; the latter obviously isn't. + +Fixes: b53e906d255d ("nios2: Signal handling support") +Signed-off-by: Al Viro +Signed-off-by: Dinh Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + arch/nios2/kernel/signal.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/nios2/kernel/signal.c ++++ b/arch/nios2/kernel/signal.c +@@ -240,7 +240,7 @@ static int do_signal(struct pt_regs *reg + /* + * If we were from a system call, check for system call restarting... + */ +- if (regs->orig_r2 >= 0) { ++ if (regs->orig_r2 >= 0 && regs->r1) { + continue_addr = regs->ea; + restart_addr = continue_addr - 4; + retval = regs->r2; diff --git a/queue-4.9/nios2-page-fault-et.al.-are-not-restartable-syscalls.patch b/queue-4.9/nios2-page-fault-et.al.-are-not-restartable-syscalls.patch new file mode 100644 index 00000000000..fc2926aab78 --- /dev/null +++ b/queue-4.9/nios2-page-fault-et.al.-are-not-restartable-syscalls.patch @@ -0,0 +1,53 @@ +From 8535c239ac674f7ead0f2652932d35c52c4123b2 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Mon, 8 Aug 2022 16:06:04 +0100 +Subject: nios2: page fault et.al. are *not* restartable syscalls... + +From: Al Viro + +commit 8535c239ac674f7ead0f2652932d35c52c4123b2 upstream. + +make sure that ->orig_r2 is negative for everything except +the syscalls. + +Fixes: 82ed08dd1b0e ("nios2: Exception handling") +Signed-off-by: Al Viro +Signed-off-by: Dinh Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + arch/nios2/include/asm/entry.h | 3 ++- + arch/nios2/kernel/entry.S | 4 +--- + 2 files changed, 3 insertions(+), 4 deletions(-) + +--- a/arch/nios2/include/asm/entry.h ++++ b/arch/nios2/include/asm/entry.h +@@ -50,7 +50,8 @@ + stw r13, PT_R13(sp) + stw r14, PT_R14(sp) + stw r15, PT_R15(sp) +- stw r2, PT_ORIG_R2(sp) ++ movi r24, -1 ++ stw r24, PT_ORIG_R2(sp) + stw r7, PT_ORIG_R7(sp) + + stw ra, PT_RA(sp) +--- a/arch/nios2/kernel/entry.S ++++ b/arch/nios2/kernel/entry.S +@@ -185,6 +185,7 @@ ENTRY(handle_system_call) + ldw r5, PT_R5(sp) + + local_restart: ++ stw r2, PT_ORIG_R2(sp) + /* Check that the requested system call is within limits */ + movui r1, __NR_syscalls + bgeu r2, r1, ret_invsyscall +@@ -336,9 +337,6 @@ external_interrupt: + /* skip if no interrupt is pending */ + beq r12, r0, ret_from_interrupt + +- movi r24, -1 +- stw r24, PT_ORIG_R2(sp) +- + /* + * Process an external hardware interrupt. + */ diff --git a/queue-4.9/nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch b/queue-4.9/nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch new file mode 100644 index 00000000000..f44a95d26b2 --- /dev/null +++ b/queue-4.9/nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch @@ -0,0 +1,27 @@ +From 411a76b7219555c55867466c82d70ce928d6c9e1 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Mon, 8 Aug 2022 16:09:16 +0100 +Subject: nios2: restarts apply only to the first sigframe we build... + +From: Al Viro + +commit 411a76b7219555c55867466c82d70ce928d6c9e1 upstream. + +Fixes: b53e906d255d ("nios2: Signal handling support") +Signed-off-by: Al Viro +Signed-off-by: Dinh Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + arch/nios2/kernel/signal.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/arch/nios2/kernel/signal.c ++++ b/arch/nios2/kernel/signal.c +@@ -261,6 +261,7 @@ static int do_signal(struct pt_regs *reg + regs->ea = restart_addr; + break; + } ++ regs->orig_r2 = -1; + } + + if (get_signal(&ksig)) { diff --git a/queue-4.9/nios2-traced-syscall-does-need-to-check-the-syscall-number.patch b/queue-4.9/nios2-traced-syscall-does-need-to-check-the-syscall-number.patch new file mode 100644 index 00000000000..8b6a0e84d6b --- /dev/null +++ b/queue-4.9/nios2-traced-syscall-does-need-to-check-the-syscall-number.patch @@ -0,0 +1,47 @@ +From 25ba820ef36bdbaf9884adeac69b6e1821a7df76 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Mon, 8 Aug 2022 16:07:21 +0100 +Subject: nios2: traced syscall does need to check the syscall number + +From: Al Viro + +commit 25ba820ef36bdbaf9884adeac69b6e1821a7df76 upstream. + +all checks done before letting the tracer modify the register +state are worthless... + +Fixes: 82ed08dd1b0e ("nios2: Exception handling") +Signed-off-by: Al Viro +Signed-off-by: Dinh Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + arch/nios2/kernel/entry.S | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +--- a/arch/nios2/kernel/entry.S ++++ b/arch/nios2/kernel/entry.S +@@ -255,9 +255,9 @@ traced_system_call: + ldw r6, PT_R6(sp) + ldw r7, PT_R7(sp) + +- /* Fetch the syscall function, we don't need to check the boundaries +- * since this is already done. +- */ ++ /* Fetch the syscall function. */ ++ movui r1, __NR_syscalls ++ bgeu r2, r1, traced_invsyscall + slli r1, r2, 2 + movhi r11,%hiadj(sys_call_table) + add r1, r1, r11 +@@ -287,6 +287,11 @@ end_translate_rc_and_ret2: + RESTORE_SWITCH_STACK + br ret_from_exception + ++ /* If the syscall number was invalid return ENOSYS */ ++traced_invsyscall: ++ movi r2, -ENOSYS ++ br translate_rc_and_ret2 ++ + Luser_return: + GET_THREAD_INFO r11 /* get thread_info pointer */ + ldw r10, TI_FLAGS(r11) /* get thread_info->flags */ diff --git a/queue-4.9/series b/queue-4.9/series index 489c36c6748..4036d6d34de 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -75,3 +75,9 @@ pinctrl-qcom-msm8916-allow-camss-gp-clocks-to-be-muxed.patch vsock-fix-memory-leak-in-vsock_connect.patch xen-xenbus-fix-return-type-in-xenbus_file_read.patch atm-idt77252-fix-use-after-free-bugs-caused-by-tst_timer.patch +nios2-page-fault-et.al.-are-not-restartable-syscalls.patch +nios2-don-t-leave-nulls-in-sys_call_table.patch +nios2-traced-syscall-does-need-to-check-the-syscall-number.patch +nios2-fix-syscall-restart-checks.patch +nios2-restarts-apply-only-to-the-first-sigframe-we-build.patch +nios2-add-force_successful_syscall_return.patch