diff options
author | jh <jh@FreeBSD.org> | 2010-08-25 15:29:12 +0000 |
---|---|---|
committer | jh <jh@FreeBSD.org> | 2010-08-25 15:29:12 +0000 |
commit | 4a4bf3c51170fd6618c339831b7afbe0284378a2 (patch) | |
tree | 9fe4b5f894ce1a7c0198bc106bdb28ab34346d21 /sys/fs/devfs | |
parent | d2b87ab5767b4dd49984883d979dd28c459b7968 (diff) | |
download | FreeBSD-src-4a4bf3c51170fd6618c339831b7afbe0284378a2.zip FreeBSD-src-4a4bf3c51170fd6618c339831b7afbe0284378a2.tar.gz |
Call devfs_populate_vp() from devfs_getattr(). It was possible that
fstat(2) returned stale information through an open file descriptor.
Diffstat (limited to 'sys/fs/devfs')
-rw-r--r-- | sys/fs/devfs/devfs_vnops.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 2e106fe..dfcdf1a 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -618,10 +618,18 @@ devfs_getattr(struct vop_getattr_args *ap) { struct vnode *vp = ap->a_vp; struct vattr *vap = ap->a_vap; - int error = 0; + int error; struct devfs_dirent *de; + struct devfs_mount *dmp; struct cdev *dev; + error = devfs_populate_vp(vp); + if (error != 0) + return (error); + + dmp = VFSTODEVFS(vp->v_mount); + sx_xunlock(&dmp->dm_lock); + de = vp->v_data; KASSERT(de != NULL, ("Null dirent in devfs_getattr vp=%p", vp)); if (vp->v_type == VDIR) { |