Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'arc-4.0-fixes-part-2' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc

Pull ARC fixes from Vineet Gupta:
"We found some issues with signal handling taking down the system. I
know its late, but these are important and all marked for stable.

ARC signal handling related fixes uncovered during recent testing of
NPTL tools"

* tag 'arc-4.0-fixes-part-2' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
ARC: signal handling robustify
ARC: SA_SIGINFO ucontext regs off-by-one

+18 -6
+18 -6
arch/arc/kernel/signal.c
··· 67 67 sigset_t *set) 68 68 { 69 69 int err; 70 - err = __copy_to_user(&(sf->uc.uc_mcontext.regs), regs, 70 + err = __copy_to_user(&(sf->uc.uc_mcontext.regs.scratch), regs, 71 71 sizeof(sf->uc.uc_mcontext.regs.scratch)); 72 72 err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(sigset_t)); 73 73 ··· 83 83 if (!err) 84 84 set_current_blocked(&set); 85 85 86 - err |= __copy_from_user(regs, &(sf->uc.uc_mcontext.regs), 86 + err |= __copy_from_user(regs, &(sf->uc.uc_mcontext.regs.scratch), 87 87 sizeof(sf->uc.uc_mcontext.regs.scratch)); 88 88 89 89 return err; ··· 130 130 131 131 /* Don't restart from sigreturn */ 132 132 syscall_wont_restart(regs); 133 + 134 + /* 135 + * Ensure that sigreturn always returns to user mode (in case the 136 + * regs saved on user stack got fudged between save and sigreturn) 137 + * Otherwise it is easy to panic the kernel with a custom 138 + * signal handler and/or restorer which clobberes the status32/ret 139 + * to return to a bogus location in kernel mode. 140 + */ 141 + regs->status32 |= STATUS_U_MASK; 133 142 134 143 return regs->r0; 135 144 ··· 238 229 239 230 /* 240 231 * handler returns using sigreturn stub provided already by userpsace 232 + * If not, nuke the process right away 241 233 */ 242 - BUG_ON(!(ksig->ka.sa.sa_flags & SA_RESTORER)); 234 + if(!(ksig->ka.sa.sa_flags & SA_RESTORER)) 235 + return 1; 236 + 243 237 regs->blink = (unsigned long)ksig->ka.sa.sa_restorer; 244 238 245 239 /* User Stack for signal handler will be above the frame just carved */ ··· 308 296 handle_signal(struct ksignal *ksig, struct pt_regs *regs) 309 297 { 310 298 sigset_t *oldset = sigmask_to_save(); 311 - int ret; 299 + int failed; 312 300 313 301 /* Set up the stack frame */ 314 - ret = setup_rt_frame(ksig, oldset, regs); 302 + failed = setup_rt_frame(ksig, oldset, regs); 315 303 316 - signal_setup_done(ret, ksig, 0); 304 + signal_setup_done(failed, ksig, 0); 317 305 } 318 306 319 307 void do_signal(struct pt_regs *regs)