Module Name: src
Committed By: christos
Date: Thu Dec 15 20:55:02 UTC 2011
Modified Files:
src/sys/miscfs/procfs: procfs_linux.c
Log Message:
PR/45700: use dostatvfs instead of grabbing the latest cached copy of
struct statvfs from the mount point, so that chroot is handled properly.
To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/sys/miscfs/procfs/procfs_linux.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/miscfs/procfs/procfs_linux.c
diff -u src/sys/miscfs/procfs/procfs_linux.c:1.61 src/sys/miscfs/procfs/procfs_linux.c:1.62
--- src/sys/miscfs/procfs/procfs_linux.c:1.61 Sun Sep 4 13:32:10 2011
+++ src/sys/miscfs/procfs/procfs_linux.c Thu Dec 15 15:55:02 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_linux.c,v 1.61 2011/09/04 17:32:10 jmcneill Exp $ */
+/* $NetBSD: procfs_linux.c,v 1.62 2011/12/15 20:55:02 christos Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.61 2011/09/04 17:32:10 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.62 2011/12/15 20:55:02 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -54,6 +54,7 @@ __KERNEL_RCSID(0, "$NetBSD: procfs_linux
#include <sys/mount.h>
#include <sys/conf.h>
#include <sys/sysctl.h>
+#include <sys/kauth.h>
#include <miscfs/procfs/procfs.h>
@@ -564,36 +565,39 @@ procfs_domounts(struct lwp *curl, struct
const char *fsname;
size_t len, mtabsz = 0;
struct mount *mp, *nmp;
- struct statvfs *sfs;
- int error = 0;
+ struct statvfs sfs;
+ int error = 0, suser;
+
+ suser = kauth_authorize_generic(curl->l_cred,
+ KAUTH_GENERIC_ISSUSER, NULL) == 0;
bf = malloc(LBFSZ, M_TEMP, M_WAITOK);
mutex_enter(&mountlist_lock);
for (mp = CIRCLEQ_FIRST(&mountlist); mp != (void *)&mountlist;
mp = nmp) {
- if (vfs_busy(mp, &nmp)) {
+ if (vfs_busy(mp, &nmp))
continue;
- }
- sfs = &mp->mnt_stat;
+ if (dostatvfs(mp, &sfs, curl, MNT_WAIT, suser) != 0)
+ continue;
/* Linux uses different names for some filesystems */
- fsname = sfs->f_fstypename;
+ fsname = sfs.f_fstypename;
if (strcmp(fsname, "procfs") == 0)
fsname = "proc";
else if (strcmp(fsname, "ext2fs") == 0)
fsname = "ext2";
len = snprintf(bf, LBFSZ, "%s %s %s %s%s%s%s%s%s 0 0\n",
- sfs->f_mntfromname,
- sfs->f_mntonname,
+ sfs.f_mntfromname,
+ sfs.f_mntonname,
fsname,
- (mp->mnt_flag & MNT_RDONLY) ? "ro" : "rw",
- (mp->mnt_flag & MNT_NOSUID) ? ",nosuid" : "",
- (mp->mnt_flag & MNT_NOEXEC) ? ",noexec" : "",
- (mp->mnt_flag & MNT_NODEV) ? ",nodev" : "",
- (mp->mnt_flag & MNT_SYNCHRONOUS) ? ",sync" : "",
- (mp->mnt_flag & MNT_NOATIME) ? ",noatime" : ""
+ (sfs.f_flag & ST_RDONLY) ? "ro" : "rw",
+ (sfs.f_flag & ST_NOSUID) ? ",nosuid" : "",
+ (sfs.f_flag & ST_NOEXEC) ? ",noexec" : "",
+ (sfs.f_flag & ST_NODEV) ? ",nodev" : "",
+ (sfs.f_flag & ST_SYNCHRONOUS) ? ",sync" : "",
+ (sfs.f_flag & ST_NOATIME) ? ",noatime" : ""
);
mtab = realloc(mtab, mtabsz + len, M_TEMP, M_WAITOK);