From: Greg Kroah-Hartman Date: Fri, 2 Nov 2018 05:45:36 +0000 (+0100) Subject: 4.19-stable patches X-Git-Tag: v4.19.1~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=181e06f13a1289a61f9a09e60ba1806cdd036409;p=thirdparty%2Fkernel%2Fstable-queue.git 4.19-stable patches added patches: sparc64-export-__node_distance.patch sparc64-make-corrupted-user-stacks-more-debuggable.patch sparc64-wire-up-compat-getpeername-and-getsockname.patch --- diff --git a/queue-4.19/series b/queue-4.19/series index e15f26f3055..2ad0a252a14 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -18,3 +18,6 @@ net-properly-unlink-gro-packets-on-overflow.patch r8169-fix-broken-wake-on-lan-from-s5-poweroff.patch revert-be2net-remove-desc-field-from-be_eq_obj.patch sctp-check-policy-more-carefully-when-getting-pr-status.patch +sparc64-export-__node_distance.patch +sparc64-make-corrupted-user-stacks-more-debuggable.patch +sparc64-wire-up-compat-getpeername-and-getsockname.patch diff --git a/queue-4.19/sparc64-export-__node_distance.patch b/queue-4.19/sparc64-export-__node_distance.patch new file mode 100644 index 00000000000..a97f3f68c48 --- /dev/null +++ b/queue-4.19/sparc64-export-__node_distance.patch @@ -0,0 +1,31 @@ +From foo@baz Fri Nov 2 06:28:35 CET 2018 +From: "David S. Miller" +Date: Fri, 26 Oct 2018 15:11:56 -0700 +Subject: sparc64: Export __node_distance. + +From: "David S. Miller" + +[ Upstream commit 2b4792eaa9f553764047d157365ed8b7787751a3 ] + +Some drivers reference it via node_distance(), for example the +NVME host driver core. + +ERROR: "__node_distance" [drivers/nvme/host/nvme-core.ko] undefined! +make[1]: *** [scripts/Makefile.modpost:92: __modpost] Error 1 + +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + arch/sparc/mm/init_64.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/arch/sparc/mm/init_64.c ++++ b/arch/sparc/mm/init_64.c +@@ -1383,6 +1383,7 @@ int __node_distance(int from, int to) + } + return numa_latency[from][to]; + } ++EXPORT_SYMBOL(__node_distance); + + static int __init find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp) + { diff --git a/queue-4.19/sparc64-make-corrupted-user-stacks-more-debuggable.patch b/queue-4.19/sparc64-make-corrupted-user-stacks-more-debuggable.patch new file mode 100644 index 00000000000..b5d81be9187 --- /dev/null +++ b/queue-4.19/sparc64-make-corrupted-user-stacks-more-debuggable.patch @@ -0,0 +1,159 @@ +From foo@baz Fri Nov 2 06:28:35 CET 2018 +From: David Miller +Date: Thu, 25 Oct 2018 20:36:46 -0700 +Subject: sparc64: Make corrupted user stacks more debuggable. + +From: David Miller + +[ Upstream commit 5b4fc3882a649c9411dd0dcad2ddb78e911d340e ] + +Right now if we get a corrupted user stack frame we do a +do_exit(SIGILL) which is not helpful. + +If under a debugger, this behavior causes the inferior process to +exit. So the register and other state cannot be examined at the time +of the event. + +Instead, conditionally log a rate limited kernel log message and then +force a SIGSEGV. + +With bits and ideas borrowed (as usual) from powerpc. + +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + arch/sparc/include/asm/switch_to_64.h | 3 ++- + arch/sparc/kernel/process_64.c | 25 +++++++++++++++++++------ + arch/sparc/kernel/rtrap_64.S | 1 + + arch/sparc/kernel/signal32.c | 12 ++++++++++-- + arch/sparc/kernel/signal_64.c | 6 +++++- + 5 files changed, 37 insertions(+), 10 deletions(-) + +--- a/arch/sparc/include/asm/switch_to_64.h ++++ b/arch/sparc/include/asm/switch_to_64.h +@@ -67,6 +67,7 @@ do { save_and_clear_fpu(); \ + } while(0) + + void synchronize_user_stack(void); +-void fault_in_user_windows(void); ++struct pt_regs; ++void fault_in_user_windows(struct pt_regs *); + + #endif /* __SPARC64_SWITCH_TO_64_H */ +--- a/arch/sparc/kernel/process_64.c ++++ b/arch/sparc/kernel/process_64.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -521,7 +522,12 @@ static void stack_unaligned(unsigned lon + force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *) sp, 0, current); + } + +-void fault_in_user_windows(void) ++static const char uwfault32[] = KERN_INFO \ ++ "%s[%d]: bad register window fault: SP %08lx (orig_sp %08lx) TPC %08lx O7 %08lx\n"; ++static const char uwfault64[] = KERN_INFO \ ++ "%s[%d]: bad register window fault: SP %016lx (orig_sp %016lx) TPC %08lx O7 %016lx\n"; ++ ++void fault_in_user_windows(struct pt_regs *regs) + { + struct thread_info *t = current_thread_info(); + unsigned long window; +@@ -534,9 +540,9 @@ void fault_in_user_windows(void) + do { + struct reg_window *rwin = &t->reg_window[window]; + int winsize = sizeof(struct reg_window); +- unsigned long sp; ++ unsigned long sp, orig_sp; + +- sp = t->rwbuf_stkptrs[window]; ++ orig_sp = sp = t->rwbuf_stkptrs[window]; + + if (test_thread_64bit_stack(sp)) + sp += STACK_BIAS; +@@ -547,8 +553,16 @@ void fault_in_user_windows(void) + stack_unaligned(sp); + + if (unlikely(copy_to_user((char __user *)sp, +- rwin, winsize))) ++ rwin, winsize))) { ++ if (show_unhandled_signals) ++ printk_ratelimited(is_compat_task() ? ++ uwfault32 : uwfault64, ++ current->comm, current->pid, ++ sp, orig_sp, ++ regs->tpc, ++ regs->u_regs[UREG_I7]); + goto barf; ++ } + } while (window--); + } + set_thread_wsaved(0); +@@ -556,8 +570,7 @@ void fault_in_user_windows(void) + + barf: + set_thread_wsaved(window + 1); +- user_exit(); +- do_exit(SIGILL); ++ force_sig(SIGSEGV, current); + } + + asmlinkage long sparc_do_fork(unsigned long clone_flags, +--- a/arch/sparc/kernel/rtrap_64.S ++++ b/arch/sparc/kernel/rtrap_64.S +@@ -39,6 +39,7 @@ __handle_preemption: + wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate + + __handle_user_windows: ++ add %sp, PTREGS_OFF, %o0 + call fault_in_user_windows + 661: wrpr %g0, RTRAP_PSTATE, %pstate + /* If userspace is using ADI, it could potentially pass +--- a/arch/sparc/kernel/signal32.c ++++ b/arch/sparc/kernel/signal32.c +@@ -371,7 +371,11 @@ static int setup_frame32(struct ksignal + get_sigframe(ksig, regs, sigframe_size); + + if (invalid_frame_pointer(sf, sigframe_size)) { +- do_exit(SIGILL); ++ if (show_unhandled_signals) ++ pr_info("%s[%d] bad frame in setup_frame32: %08lx TPC %08lx O7 %08lx\n", ++ current->comm, current->pid, (unsigned long)sf, ++ regs->tpc, regs->u_regs[UREG_I7]); ++ force_sigsegv(ksig->sig, current); + return -EINVAL; + } + +@@ -501,7 +505,11 @@ static int setup_rt_frame32(struct ksign + get_sigframe(ksig, regs, sigframe_size); + + if (invalid_frame_pointer(sf, sigframe_size)) { +- do_exit(SIGILL); ++ if (show_unhandled_signals) ++ pr_info("%s[%d] bad frame in setup_rt_frame32: %08lx TPC %08lx O7 %08lx\n", ++ current->comm, current->pid, (unsigned long)sf, ++ regs->tpc, regs->u_regs[UREG_I7]); ++ force_sigsegv(ksig->sig, current); + return -EINVAL; + } + +--- a/arch/sparc/kernel/signal_64.c ++++ b/arch/sparc/kernel/signal_64.c +@@ -370,7 +370,11 @@ setup_rt_frame(struct ksignal *ksig, str + get_sigframe(ksig, regs, sf_size); + + if (invalid_frame_pointer (sf)) { +- do_exit(SIGILL); /* won't return, actually */ ++ if (show_unhandled_signals) ++ pr_info("%s[%d] bad frame in setup_rt_frame: %016lx TPC %016lx O7 %016lx\n", ++ current->comm, current->pid, (unsigned long)sf, ++ regs->tpc, regs->u_regs[UREG_I7]); ++ force_sigsegv(ksig->sig, current); + return -EINVAL; + } + diff --git a/queue-4.19/sparc64-wire-up-compat-getpeername-and-getsockname.patch b/queue-4.19/sparc64-wire-up-compat-getpeername-and-getsockname.patch new file mode 100644 index 00000000000..9dcbdf83f8c --- /dev/null +++ b/queue-4.19/sparc64-wire-up-compat-getpeername-and-getsockname.patch @@ -0,0 +1,31 @@ +From foo@baz Fri Nov 2 06:28:35 CET 2018 +From: "David S. Miller" +Date: Wed, 31 Oct 2018 18:30:21 -0700 +Subject: sparc64: Wire up compat getpeername and getsockname. + +From: "David S. Miller" + +[ Upstream commit 1f2b5b8e2df4591fbca430aff9c5a072dcc0f408 ] + +Fixes: 8b30ca73b7cc ("sparc: Add all necessary direct socket system calls.") +Reported-by: Joseph Myers +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + arch/sparc/kernel/systbls_64.S | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/arch/sparc/kernel/systbls_64.S ++++ b/arch/sparc/kernel/systbls_64.S +@@ -47,9 +47,9 @@ sys_call_table32: + .word sys_recvfrom, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate + /*130*/ .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_sendto, sys_shutdown + .word sys_socketpair, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 +-/*140*/ .word sys_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, compat_sys_getrlimit ++/*140*/ .word sys_sendfile64, sys_getpeername, compat_sys_futex, sys_gettid, compat_sys_getrlimit + .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write +-/*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 ++/*150*/ .word sys_getsockname, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 + .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount + /*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall + .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr