kernel - Fix fstatfs() and fstatvfs() when called from a null-mounted chroot()
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 1 Apr 2011 23:03:09 +0000 (16:03 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 1 Apr 2011 23:03:09 +0000 (16:03 -0700)
* These funtions were using the wrong starting mount pointer when calling
  cache_fullpath().  They were using the mount pointer for the open file's
  vnode instead of the overlay (null) mount pointer.

  This caused cache_fullpath() to believe the fd represented a file outside
  the chroot and return an error.

Reported-by: Francois Tigeot<ftigeot@wolfpond.org>:
sys/kern/vfs_syscalls.c

index 3c41db1..efe3bcd 100644 (file)
@@ -1141,7 +1141,14 @@ kern_fstatfs(int fd, struct statfs *buf)
        KKASSERT(p);
        if ((error = holdvnode(p->p_fd, fd, &fp)) != 0)
                return (error);
-       mp = ((struct vnode *)fp->f_data)->v_mount;
+
+       /*
+        * Try to use mount info from any overlays rather than the
+        * mount info for the underlying vnode, otherwise we will
+        * fail when operating on null-mounted paths inside a chroot.
+        */
+       if ((mp = fp->f_nchandle.mount) == NULL)
+               mp = ((struct vnode *)fp->f_data)->v_mount;
        if (mp == NULL) {
                error = EBADF;
                goto done;
@@ -1247,7 +1254,8 @@ kern_fstatvfs(int fd, struct statvfs *buf)
        KKASSERT(p);
        if ((error = holdvnode(p->p_fd, fd, &fp)) != 0)
                return (error);
-       mp = ((struct vnode *)fp->f_data)->v_mount;
+       if ((mp = fp->f_nchandle.mount) == NULL)
+               mp = ((struct vnode *)fp->f_data)->v_mount;
        if (mp == NULL) {
                error = EBADF;
                goto done;