From owner-freebsd-current Sat Aug 18 18: 8:59 2001 Delivered-To: freebsd-current@freebsd.org Received: from nagual.pp.ru (pobrecita.freebsd.ru [194.87.13.42]) by hub.freebsd.org (Postfix) with ESMTP id 68DD237B40C; Sat, 18 Aug 2001 18:08:48 -0700 (PDT) (envelope-from ache@nagual.pp.ru) Received: (from ache@localhost) by nagual.pp.ru (8.11.4/8.11.4) id f7J18d886476; Sun, 19 Aug 2001 05:08:40 +0400 (MSD) (envelope-from ache) Date: Sun, 19 Aug 2001 05:08:38 +0400 From: "Andrey A. Chernov" To: Bruce Evans Cc: arch@FreeBSD.ORG, current@FreeBSD.ORG Subject: Re: CFR: lseek() POSIXed patch Message-ID: <20010819050838.A86450@nagual.pp.ru> References: <20010815125248.A2588@nagual.pp.ru> <20010815190108.J19482-100000@besplex.bde.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20010815190108.J19482-100000@besplex.bde.org> User-Agent: Mutt/1.3.20i Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG Updated variant: --- vfs_syscalls.c.old Sat Aug 11 02:14:18 2001 +++ vfs_syscalls.c Sun Aug 19 05:01:32 2001 @@ -1614,29 +1614,44 @@ register struct filedesc *fdp = p->p_fd; register struct file *fp; struct vattr vattr; - int error; + struct vnode *vp; + off_t offset; + int error, noneg; if ((u_int)SCARG(uap, fd) >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL) return (EBADF); if (fp->f_type != DTYPE_VNODE) return (ESPIPE); + vp = (struct vnode *)fp->f_data; + noneg = (vp->v_type != VCHR); + offset = SCARG(uap, offset); switch (SCARG(uap, whence)) { case L_INCR: - fp->f_offset += SCARG(uap, offset); + if (noneg && + ((offset > 0 && fp->f_offset > OFF_MAX - offset) || + (offset < 0 && fp->f_offset < OFF_MIN - offset))) + return (EOVERFLOW); + offset += fp->f_offset; break; case L_XTND: - error=VOP_GETATTR((struct vnode *)fp->f_data, &vattr, cred, p); + error = VOP_GETATTR(vp, &vattr, cred, p); if (error) return (error); - fp->f_offset = SCARG(uap, offset) + vattr.va_size; + if (noneg && + ((offset > 0 && vattr.va_size > OFF_MAX - offset) || + (offset < 0 && vattr.va_size < OFF_MIN - offset))) + return (EOVERFLOW); + offset += vattr.va_size; break; case L_SET: - fp->f_offset = SCARG(uap, offset); break; default: return (EINVAL); } + if (noneg && offset < 0) + return (EINVAL); + fp->f_offset = offset; *(off_t *)(p->p_retval) = fp->f_offset; return (0); } -- Andrey A. Chernov http://ache.pp.ru/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message