Fix assumption of current != NULL
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 25 Oct 2018 13:13:37 +0000 (09:13 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 25 Oct 2018 13:13:37 +0000 (09:13 -0400)
This goes back to the root cause of commit 38346732733e ("Clear current
before calling proc_decref()").  We needed to clear current back when we
abandon_core().  However, the kthread still thought it needed to save
the address space / context of the process and would try to incref a
NULL pointer.

The root issue is that the kthread was a process kthread, but it lost
its connection to the process during the execution of a syscall (or
trap).  The syscall doesn't even need to be the one that did the
killing.  We just needed to be a non-ktask/RKM.

We could also change up the way the kthread flags work, but I wanted to
highlight the existence of this bug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/kthread.c

index 0439f99..ea56d27 100644 (file)
@@ -417,9 +417,8 @@ void sem_down(struct semaphore *sem)
         *
         * Normal kthreads need to stay in the process context, but we want the core
         * (which could be a vcore) to stay in the context too. */
-       if (kthread->flags & KTH_SAVE_ADDR_SPACE) {
+       if ((kthread->flags & KTH_SAVE_ADDR_SPACE) && current) {
                kthread->proc = current;
-               assert(kthread->proc);
                /* In the future, we could check owning_proc. If it isn't set, we could
                 * clear current and transfer the refcnt to kthread->proc.  If so, we'll
                 * need to reset the cr3 to something (boot_cr3 or owning_proc's cr3),