From: niklas Date: Wed, 26 Feb 1997 16:38:20 +0000 (+0000) Subject: From tholo: Do not do strict POSIX offset checking on character devices. X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=9fc358adb88bd1712c3d7dad87138c151d8ad934;p=openbsd From tholo: Do not do strict POSIX offset checking on character devices. This fixes the problem of not being able to read kernel virtual memory on the alpha, thus breaking things like ps etc. --- diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 46df453aa0c..ebfa0276489 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_syscalls.c,v 1.23 1997/02/14 17:20:09 deraadt Exp $ */ +/* $OpenBSD: vfs_syscalls.c,v 1.24 1997/02/26 16:38:20 niklas Exp $ */ /* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */ /* @@ -1166,7 +1166,7 @@ sys_lseek(p, v, retval) register struct file *fp; struct vattr vattr; struct vnode *vp; - int error; + int error, special; if ((u_int)SCARG(uap, fd) >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL) @@ -1176,9 +1176,13 @@ sys_lseek(p, v, retval) vp = (struct vnode *)fp->f_data; if (vp->v_type == VFIFO) return (ESPIPE); + if (vp->v_type == VCHR) + special = 1; + else + special = 0; switch (SCARG(uap, whence)) { case L_INCR: - if (fp->f_offset + SCARG(uap, offset) < 0) + if (!special && fp->f_offset + SCARG(uap, offset) < 0) return (EINVAL); fp->f_offset += SCARG(uap, offset); break; @@ -1187,12 +1191,12 @@ sys_lseek(p, v, retval) cred, p); if (error) return (error); - if ((off_t)vattr.va_size + SCARG(uap, offset) < 0) + if (!special && (off_t)vattr.va_size + SCARG(uap, offset) < 0) return (EINVAL); fp->f_offset = SCARG(uap, offset) + vattr.va_size; break; case L_SET: - if (SCARG(uap, offset) < 0) + if (!special && SCARG(uap, offset) < 0) return (EINVAL); fp->f_offset = SCARG(uap, offset); break;