diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-09-10 16:31:04 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-09-15 19:51:55 -0400 |
commit | 7798bf2140ebcc36eafec6a4194fffd8d585d471 (patch) | |
tree | f3babde13b19f0f95ba1f27d5af1569404722444 | |
parent | 085354f907969fb3ee33f236368f6e1dd4c74d62 (diff) |
arc: don't leak bits of kernel stack into coredump
On faulting sigreturn we do get SIGSEGV, all right, but anything
we'd put into pt_regs could end up in the coredump. And since
__copy_from_user() never zeroed on arc, we'd better bugger off
on its failure without copying random uninitialized bits of
kernel stack into pt_regs...
Cc: stable@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | arch/arc/kernel/signal.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c index 6cb3736b6b83..d347bbc086fe 100644 --- a/arch/arc/kernel/signal.c +++ b/arch/arc/kernel/signal.c | |||
@@ -107,13 +107,13 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf) | |||
107 | struct user_regs_struct uregs; | 107 | struct user_regs_struct uregs; |
108 | 108 | ||
109 | err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set)); | 109 | err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set)); |
110 | if (!err) | ||
111 | set_current_blocked(&set); | ||
112 | |||
113 | err |= __copy_from_user(&uregs.scratch, | 110 | err |= __copy_from_user(&uregs.scratch, |
114 | &(sf->uc.uc_mcontext.regs.scratch), | 111 | &(sf->uc.uc_mcontext.regs.scratch), |
115 | sizeof(sf->uc.uc_mcontext.regs.scratch)); | 112 | sizeof(sf->uc.uc_mcontext.regs.scratch)); |
113 | if (err) | ||
114 | return err; | ||
116 | 115 | ||
116 | set_current_blocked(&set); | ||
117 | regs->bta = uregs.scratch.bta; | 117 | regs->bta = uregs.scratch.bta; |
118 | regs->lp_start = uregs.scratch.lp_start; | 118 | regs->lp_start = uregs.scratch.lp_start; |
119 | regs->lp_end = uregs.scratch.lp_end; | 119 | regs->lp_end = uregs.scratch.lp_end; |
@@ -138,7 +138,7 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf) | |||
138 | regs->r0 = uregs.scratch.r0; | 138 | regs->r0 = uregs.scratch.r0; |
139 | regs->sp = uregs.scratch.sp; | 139 | regs->sp = uregs.scratch.sp; |
140 | 140 | ||
141 | return err; | 141 | return 0; |
142 | } | 142 | } |
143 | 143 | ||
144 | static inline int is_do_ss_needed(unsigned int magic) | 144 | static inline int is_do_ss_needed(unsigned int magic) |