diff options
author | brian <brian@FreeBSD.org> | 2010-08-25 18:09:51 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 2010-08-25 18:09:51 +0000 |
commit | e098f7b0336f194ed576cae2bd42ae3709bfece5 (patch) | |
tree | 4f10f51efc672aad932b8da6e64cfd6502885bf2 /sys/kern/vfs_default.c | |
parent | c0ca08ef8eea370661edb80f51d63eda654cd938 (diff) | |
download | FreeBSD-src-e098f7b0336f194ed576cae2bd42ae3709bfece5.zip FreeBSD-src-e098f7b0336f194ed576cae2bd42ae3709bfece5.tar.gz |
If we read zero bytes from the directory, early out with ENOENT
rather than forging ahead and interpreting garbage buffer content
and dirent structures.
This change backs out r211684 which was essentially a no-op.
MFC after: 1 week
Diffstat (limited to 'sys/kern/vfs_default.c')
-rw-r--r-- | sys/kern/vfs_default.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index bf037fe..195e735 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -281,9 +281,13 @@ get_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf, if (error) return (error); - *cpos = dirbuf; - *len = uio.uio_offset - *off; *off = uio.uio_offset; + + *cpos = dirbuf; + *len = (dirbuflen - uio.uio_resid); + + if (*len == 0) + return (ENOENT); } dp = (struct dirent *)(*cpos); |