]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.19-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 Nov 2018 05:45:36 +0000 (06:45 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 Nov 2018 05:45:36 +0000 (06:45 +0100)
added patches:
sparc64-export-__node_distance.patch
sparc64-make-corrupted-user-stacks-more-debuggable.patch
sparc64-wire-up-compat-getpeername-and-getsockname.patch

queue-4.19/series
queue-4.19/sparc64-export-__node_distance.patch [new file with mode: 0644]
queue-4.19/sparc64-make-corrupted-user-stacks-more-debuggable.patch [new file with mode: 0644]
queue-4.19/sparc64-wire-up-compat-getpeername-and-getsockname.patch [new file with mode: 0644]

index e15f26f3055995610fc9b58d16d2ffc48a11b286..2ad0a252a14226644a60f3cb39fa814dc148df06 100644 (file)
@@ -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 (file)
index 0000000..a97f3f6
--- /dev/null
@@ -0,0 +1,31 @@
+From foo@baz Fri Nov  2 06:28:35 CET 2018
+From: "David S. Miller" <davem@davemloft.net>
+Date: Fri, 26 Oct 2018 15:11:56 -0700
+Subject: sparc64: Export __node_distance.
+
+From: "David S. Miller" <davem@davemloft.net>
+
+[ 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 <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..b5d81be
--- /dev/null
@@ -0,0 +1,159 @@
+From foo@baz Fri Nov  2 06:28:35 CET 2018
+From: David Miller <davem@redhat.com>
+Date: Thu, 25 Oct 2018 20:36:46 -0700
+Subject: sparc64: Make corrupted user stacks more debuggable.
+
+From: David Miller <davem@redhat.com>
+
+[ 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 <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <linux/sysrq.h>
+ #include <linux/nmi.h>
+ #include <linux/context_tracking.h>
++#include <linux/signal.h>
+ #include <linux/uaccess.h>
+ #include <asm/page.h>
+@@ -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 (file)
index 0000000..9dcbdf8
--- /dev/null
@@ -0,0 +1,31 @@
+From foo@baz Fri Nov  2 06:28:35 CET 2018
+From: "David S. Miller" <davem@davemloft.net>
+Date: Wed, 31 Oct 2018 18:30:21 -0700
+Subject: sparc64: Wire up compat getpeername and getsockname.
+
+From: "David S. Miller" <davem@davemloft.net>
+
+[ Upstream commit 1f2b5b8e2df4591fbca430aff9c5a072dcc0f408 ]
+
+Fixes: 8b30ca73b7cc ("sparc: Add all necessary direct socket system calls.")
+Reported-by: Joseph Myers  <joseph@codesourcery.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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