diff options
author | mpp <mpp@FreeBSD.org> | 1996-03-10 00:20:28 +0000 |
---|---|---|
committer | mpp <mpp@FreeBSD.org> | 1996-03-10 00:20:28 +0000 |
commit | 6bd5dbcc4cfe066d649a1ac2314b550181993437 (patch) | |
tree | ae4f060b672ae4e003db7cb7b09b7591c5254b4f /sbin | |
parent | cd59967f37c55302dba89ddabe3c33f27c828660 (diff) | |
download | FreeBSD-src-6bd5dbcc4cfe066d649a1ac2314b550181993437.zip FreeBSD-src-6bd5dbcc4cfe066d649a1ac2314b550181993437.tar.gz |
Do not allow the caller to specify the same path for the special
device file and the mount point. This prevents the "unexpected recursive
lock" panic from happening.
This is a temporary fix. A kernel fix would be much much more ugly than
this, and still wouldn't be the "right" way to fix it. After some
of Terry's file system rework is installed, it will be possible to
properly fix this problem in a clean manner. Until then,
this change should prevent use from getting a problem report
on this every month or so (and I just noticed that someone in
one of the freebsd news groups was complaining about this problem, too).
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/mount/mount.c | 19 | ||||
-rw-r--r-- | sbin/mount_ifs/mount.c | 19 |
2 files changed, 38 insertions, 0 deletions
diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 1be00ec..075ffcf 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -262,6 +262,7 @@ mountfs(vfstype, spec, name, flags, options, mntopts) pid_t pid; int argc, i, status; char *optbuf, execname[MAXPATHLEN + 1], mntpath[MAXPATHLEN]; + char specpath[MAXPATHLEN]; if (realpath(name, mntpath) != NULL && stat(mntpath, &sb) == 0) { if (!S_ISDIR(sb.st_mode)) { @@ -273,6 +274,24 @@ mountfs(vfstype, spec, name, flags, options, mntopts) return (1); } + /* + * The following check is a kludge to prevent the caller from + * accidently using the file as the special device file and + * the mount point. This will cause a panic due to a recursive + * vnode lock. After some of the planned reworking of the + * file system code is done, the kernel can be fixed properly + * and this stupid check can be removed. + */ + if (realpath(spec, specpath) == NULL) { + warn("%s", specpath); + return (1); + } + if (strcmp(mntpath, specpath) == 0) { + warnx("%s: Special device file and mount point may not be the same", + specpath); + return (1); + } + if (mntopts == NULL) mntopts = ""; diff --git a/sbin/mount_ifs/mount.c b/sbin/mount_ifs/mount.c index 1be00ec..075ffcf 100644 --- a/sbin/mount_ifs/mount.c +++ b/sbin/mount_ifs/mount.c @@ -262,6 +262,7 @@ mountfs(vfstype, spec, name, flags, options, mntopts) pid_t pid; int argc, i, status; char *optbuf, execname[MAXPATHLEN + 1], mntpath[MAXPATHLEN]; + char specpath[MAXPATHLEN]; if (realpath(name, mntpath) != NULL && stat(mntpath, &sb) == 0) { if (!S_ISDIR(sb.st_mode)) { @@ -273,6 +274,24 @@ mountfs(vfstype, spec, name, flags, options, mntopts) return (1); } + /* + * The following check is a kludge to prevent the caller from + * accidently using the file as the special device file and + * the mount point. This will cause a panic due to a recursive + * vnode lock. After some of the planned reworking of the + * file system code is done, the kernel can be fixed properly + * and this stupid check can be removed. + */ + if (realpath(spec, specpath) == NULL) { + warn("%s", specpath); + return (1); + } + if (strcmp(mntpath, specpath) == 0) { + warnx("%s: Special device file and mount point may not be the same", + specpath); + return (1); + } + if (mntopts == NULL) mntopts = ""; |