summaryrefslogtreecommitdiffstats
path: root/usr.sbin/mountd
diff options
context:
space:
mode:
authoriedowse <iedowse@FreeBSD.org>2001-04-22 21:50:30 +0000
committeriedowse <iedowse@FreeBSD.org>2001-04-22 21:50:30 +0000
commit701f37e23c0faa12fb8e068be17956b3a4ca4678 (patch)
tree01caf9fd3c52c2c584a18362adbc3d5cceed03a7 /usr.sbin/mountd
parentec7938a91df0a860785f3bd531cd22ba1ebb8ae2 (diff)
downloadFreeBSD-src-701f37e23c0faa12fb8e068be17956b3a4ca4678.zip
FreeBSD-src-701f37e23c0faa12fb8e068be17956b3a4ca4678.tar.gz
When exporting a directory that is not a mountpoint, mountd repeatedly
removes the last path component until the mount() succeeds. However, the code never checks if it has passed the mountpoint, so in some cases where the mount() never succeeds, it can end up applying the flags from a mounted filesystem to the underlying one. Add a sanity check to the code which removes the last path component: test that the fsid associated with the new path is the same as that of the old one. PR: bin/7872
Diffstat (limited to 'usr.sbin/mountd')
-rw-r--r--usr.sbin/mountd/mountd.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c
index 303896c..3726cba 100644
--- a/usr.sbin/mountd/mountd.c
+++ b/usr.sbin/mountd/mountd.c
@@ -1734,6 +1734,7 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
int dirplen;
struct statfs *fsb;
{
+ struct statfs fsb1;
struct addrinfo *ai;
struct export_args *eap;
char *cp = NULL;
@@ -1835,6 +1836,13 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
}
savedc = *cp;
*cp = '\0';
+ /* Check that we're still on the same filesystem. */
+ if (statfs(dirp, &fsb1) != 0 || bcmp(&fsb1.f_fsid,
+ &fsb->f_fsid, sizeof(fsb1.f_fsid)) != 0) {
+ *cp = savedc;
+ syslog(LOG_ERR, "can't export %s", dirp);
+ return (1);
+ }
}
skip:
if (ai != NULL)
OpenPOWER on IntegriCloud