make pledge_check(), used for syscall check with pledge, returns an error and
authorsemarie <semarie@openbsd.org>
Mon, 26 Oct 2015 07:24:20 +0000 (07:24 +0000)
committersemarie <semarie@openbsd.org>
Mon, 26 Oct 2015 07:24:20 +0000 (07:24 +0000)
provide the required pledge request for pledge_fail().

ok deraadt@

sys/kern/kern_pledge.c
sys/sys/pledge.h
sys/sys/syscall_mi.h

index 6a8e8e1..1f8a029 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_pledge.c,v 1.74 2015/10/25 20:39:54 deraadt Exp $        */
+/*     $OpenBSD: kern_pledge.c,v 1.75 2015/10/26 07:24:20 semarie Exp $        */
 
 /*
  * Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org>
@@ -477,17 +477,24 @@ sys_pledge(struct proc *p, void *v, register_t *retval)
 }
 
 int
-pledge_check(struct proc *p, int code)
+pledge_check(struct proc *p, int code, int *tval)
 {
        p->p_pledgenote = p->p_pledgeafter = 0; /* XX optimise? */
        p->p_pledge_syscall = code;
+       *tval = 0;
 
        if (code < 0 || code > SYS_MAXSYSCALL - 1)
+               return (EINVAL);
+
+       if ((p->p_p->ps_pledge == 0) &&
+           (code == SYS_exit || code == SYS_kbind))
                return (0);
 
-       if (p->p_p->ps_pledge == 0)
-               return (code == SYS_exit || code == SYS_kbind);
-       return (p->p_p->ps_pledge & pledge_syscalls[code]);
+       if (p->p_p->ps_pledge & pledge_syscalls[code])
+               return (0);
+
+       *tval = pledge_syscalls[code];
+       return (EPERM);
 }
 
 int
index d1c373f..0620369 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pledge.h,v 1.12 2015/10/25 20:39:54 deraadt Exp $     */
+/*     $OpenBSD: pledge.h,v 1.13 2015/10/26 07:24:20 semarie Exp $     */
 
 /*
  * Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org>
@@ -91,7 +91,7 @@ static struct {
 
 #ifdef _KERNEL
 
-int    pledge_check(struct proc *, int);
+int    pledge_check(struct proc *, int, int *);
 int    pledge_fail(struct proc *, int, int);
 int    pledge_namei(struct proc *, char *);
 void   pledge_aftersyscall(struct proc *, int, int);
index 0219db0..e944c0e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall_mi.h,v 1.11 2015/10/09 01:17:18 deraadt Exp $ */
+/*     $OpenBSD: syscall_mi.h,v 1.12 2015/10/26 07:24:20 semarie Exp $ */
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -72,10 +72,10 @@ mi_syscall(struct proc *p, register_t code, const struct sysent *callp,
        if (lock)
                KERNEL_LOCK();
        pledged = (p->p_p->ps_flags & PS_PLEDGE);
-       if (pledged && !(tval = pledge_check(p, code))) {
+       if (pledged && (error = pledge_check(p, code, &tval))) {
                if (!lock)
                        KERNEL_LOCK();
-               error = pledge_fail(p, EPERM, tval);
+               error = pledge_fail(p, error, tval);
                KERNEL_UNLOCK();
                return (error);
        }