Depending on the NOLOCK flag, the KERNEL_LOCK will, or will not be acquired
before calling pledge_syscall(). I therefore conclude that KERNEL_LOCK
is not needed to call pledge_syscall().

Also remove the goto. The code is simple enough to avoid it easily.

I think this complexity was caused by some reshuffling during tame/pledge
deployment.

Index: sys/sys/syscall_mi.h
===================================================================
RCS file: /cvs/src/sys/sys/syscall_mi.h,v
retrieving revision 1.15
diff -u -p -r1.15 syscall_mi.h
--- sys/sys/syscall_mi.h        3 Nov 2015 16:14:14 -0000       1.15
+++ sys/sys/syscall_mi.h        7 Apr 2016 11:01:08 -0000
@@ -69,29 +69,24 @@ mi_syscall(struct proc *p, register_t co
        }
 #endif
 
-       if (lock)
-               KERNEL_LOCK();
        pledged = (p->p_p->ps_flags & PS_PLEDGE);
        if (pledged && (error = pledge_syscall(p, code, &tval))) {
-               if (!lock)
-                       KERNEL_LOCK();
+               KERNEL_LOCK();
                error = pledge_fail(p, error, tval);
                KERNEL_UNLOCK();
                return (error);
        }
 #if NSYSTRACE > 0
        if (ISSET(p->p_flag, P_SYSTRACE)) {
-               if (!lock)
-                       KERNEL_LOCK();
+               KERNEL_LOCK();
                error = systrace_redirect(code, p, argp, retval);
-               lock = 1;
-               goto done;
+               KERNEL_UNLOCK();
+               return (error);
        }
 #endif
+       if (lock)
+               KERNEL_LOCK();
        error = (*callp->sy_call)(p, argp, retval);
-#if NSYSTRACE > 0
-done:
-#endif
        if (lock)
                KERNEL_UNLOCK();
 

-- 
Michal Mazurek

Reply via email to