From 4f8d23d662b1aab316ceeb26924dea0b07c55250 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Tue, 25 Jan 2005 09:15:32 +0000 Subject: [PATCH] Previously a read of zero bytes got handled in devfs:vop_read() but I missed that when the vnode bypass was introduced. Deal with zero length transfers before we even get to fo_ops->fo_read(). Found by: Slawa Olhovchenkov PR: 75758 --- sys/kern/sys_generic.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 0aa178a5803f..421f2e0705ea 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -167,6 +167,11 @@ dofileread(td, fp, fd, buf, nbyte, offset, flags) struct uio *ktruio = NULL; #endif + /* Finish zero length reads right here */ + if (nbyte == 0) { + td->td_retval[0] = 0; + return(0); + } aiov.iov_base = buf; aiov.iov_len = nbyte; auio.uio_iov = &aiov; @@ -232,6 +237,13 @@ readv(struct thread *td, struct readv_args *uap) fdrop(fp, td); return (error); } + /* Finish zero length reads right here */ + if (auio->uio_resid == 0) { + td->td_retval[0] = 0; + free(auio, M_IOV); + fdrop(fp, td); + return(0); + } auio->uio_rw = UIO_READ; auio->uio_td = td; #ifdef KTRACE