shortcircuit TIOCGETA to directly return ENOTTY for non-ttys. It could
authorderaadt <deraadt@openbsd.org>
Fri, 9 Oct 2015 05:30:03 +0000 (05:30 +0000)
committerderaadt <deraadt@openbsd.org>
Fri, 9 Oct 2015 05:30:03 +0000 (05:30 +0000)
be called against a non-tty fd, so as to test "is this a tty".  Discovered
by sthen and rob pierce at the same time.

sys/kern/kern_pledge.c
sys/kern/sys_generic.c

index 4fc2091..bf11c19 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_pledge.c,v 1.3 2015/10/09 02:44:22 deraadt Exp $ */
+/*     $OpenBSD: kern_pledge.c,v 1.4 2015/10/09 05:30:03 deraadt Exp $ */
 
 /*
  * Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org>
@@ -1016,6 +1016,9 @@ pledge_ioctl_check(struct proc *p, long com, void *v)
                case FIOGETOWN:
                        return (0);
                case TIOCGETA:
+                       if (fp->f_type == DTYPE_VNODE && (vp->v_flag & VISTTY))
+                               return (0);
+                       return (ENOTTY);
                case TIOCGPGRP:
                case TIOCGWINSZ:        /* various programs */
                        if (fp->f_type == DTYPE_VNODE && (vp->v_flag & VISTTY))
@@ -1059,6 +1062,9 @@ pledge_ioctl_check(struct proc *p, long com, void *v)
                                break;
                        /* FALTHROUGH */
                case TIOCGETA:
+                       if (fp->f_type == DTYPE_VNODE && (vp->v_flag & VISTTY))
+                               return (0);
+                       return (ENOTTY);
                case TIOCGPGRP:
                case TIOCGWINSZ:        /* various programs */
 #if notyet
index 2c5ea05..df24748 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: sys_generic.c,v 1.104 2015/10/09 01:17:21 deraadt Exp $       */
+/*     $OpenBSD: sys_generic.c,v 1.105 2015/10/09 05:30:03 deraadt Exp $       */
 /*     $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $     */
 
 /*
@@ -404,7 +404,8 @@ sys_ioctl(struct proc *p, void *v, register_t *retval)
        fdp = p->p_fd;
        fp = fd_getfile_mode(fdp, SCARG(uap, fd), FREAD|FWRITE);
 
-       if (pledge_ioctl_check(p, com, fp))
+       error = pledge_ioctl_check(p, com, fp))
+       if (error)
                return (pledge_fail(p, EPERM, PLEDGE_IOCTL));
 
        if (fp == NULL)