Do not unconditionally clear pcb_onfault after a uvm_fault. That will
authorderaadt <deraadt@openbsd.org>
Fri, 5 Jun 2015 16:59:10 +0000 (16:59 +0000)
committerderaadt <deraadt@openbsd.org>
Fri, 5 Jun 2015 16:59:10 +0000 (16:59 +0000)
permit the active copyout/copyin to continue work on subsequent faulting
pages and not misinterpret & fault them as kernel bcopy against userland
addresses.  Old bug -- fall of 1996.  This should fix getentropy issues
on MP systems which have become more apparent recently, probably due to
some combo of increased ASLR with unlocked getentropy happening very soon
after vfork/fork...
ok miod

sys/arch/alpha/alpha/trap.c

index 3efaeba..fd8423d 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.78 2015/06/05 16:45:24 deraadt Exp $ */
+/* $OpenBSD: trap.c,v 1.79 2015/06/05 16:59:10 deraadt Exp $ */
 /* $NetBSD: trap.c,v 1.52 2000/05/24 16:48:33 thorpej Exp $ */
 
 /*-
@@ -448,7 +448,6 @@ do_fault:
                                if (p->p_addr->u_pcb.pcb_onfault != 0) {
                                        framep->tf_regs[FRAME_PC] =
                                            p->p_addr->u_pcb.pcb_onfault;
-                                       p->p_addr->u_pcb.pcb_onfault = 0;
                                        KERNEL_UNLOCK();
                                        goto out;
                                }