summaryrefslogtreecommitdiffstats
path: root/sbin/mount
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/mount')
-rw-r--r--sbin/mount/mount.c19
1 files changed, 19 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 = "";
OpenPOWER on IntegriCloud