[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[hurd] 11/64: Always canonicalize fstab entries with realpath
From: |
Samuel Thibault |
Subject: |
[hurd] 11/64: Always canonicalize fstab entries with realpath |
Date: |
Wed, 10 Dec 2014 15:17:03 +0000 |
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch upstream
in repository hurd.
commit 36f340ae47a0f643be6d59a8190600cdd34eef0c
Author: Samuel Thibault <address@hidden>
Date: Fri Nov 21 04:08:57 2014 +0100
Always canonicalize fstab entries with realpath
To avoid spurious ./, /, symlinks, etc.
* sutils/fstab.c (fs_set_mntent): Try to call realpath on mnt_fsname and
mnt_dir
field of `mntent'.
(fstab_find_mount): Try to call realpath on `name' parameter.
(fstab_find): Do not try to call realpath.
(fstab_read): Reset errno to zero before calling getmntent.
* utils/umount.c (main): Do not warn about missing fstab entries for
active translators.
---
sutils/fstab.c | 103 ++++++++++++++++++++++++++++++++++-----------------------
utils/umount.c | 4 +--
2 files changed, 63 insertions(+), 44 deletions(-)
diff --git a/sutils/fstab.c b/sutils/fstab.c
index ed59151..e13f15b 100644
--- a/sutils/fstab.c
+++ b/sutils/fstab.c
@@ -240,16 +240,32 @@ fstypes_find_program (struct fstypes *types, const char
*program,
/* Copy MNTENT into FS, copying component strings as well. */
error_t
-fs_set_mntent (struct fs *fs, const struct mntent *mntent)
+fs_set_mntent (struct fs *fs, const struct mntent *provided_mntent)
{
char *end;
size_t needed = 0;
+ struct mntent mntent = *provided_mntent;
+ char *real_fsname = NULL;
+ char *real_dir = NULL;
if (fs->storage)
free (fs->storage);
+ if (mntent.mnt_fsname)
+ {
+ real_fsname = realpath (mntent.mnt_fsname, NULL);
+ if (real_fsname)
+ mntent.mnt_fsname = real_fsname;
+ }
+ if (mntent.mnt_dir)
+ {
+ real_dir = realpath (mntent.mnt_dir, NULL);
+ if (real_dir)
+ mntent.mnt_dir = real_dir;
+ }
+
/* Allocate space for all string mntent fields in FS. */
-#define COUNT(field) if (mntent->field) needed += strlen (mntent->field) + 1;
+#define COUNT(field) if (mntent.field) needed += strlen (mntent.field) + 1;
COUNT (mnt_fsname);
COUNT (mnt_dir);
COUNT (mnt_type);
@@ -258,10 +274,14 @@ fs_set_mntent (struct fs *fs, const struct mntent *mntent)
fs->storage = malloc (needed);
if (! fs->storage)
- return ENOMEM;
+ {
+ free (real_fsname);
+ free (real_dir);
+ return ENOMEM;
+ }
- if (!fs->mntent.mnt_dir || !mntent->mnt_dir
- || strcmp (fs->mntent.mnt_dir, mntent->mnt_dir) != 0)
+ if (!fs->mntent.mnt_dir || !mntent.mnt_dir
+ || strcmp (fs->mntent.mnt_dir, mntent.mnt_dir) != 0)
{
fs->mounted = fs->readonly = -1;
if (fs->fsys != MACH_PORT_NULL)
@@ -270,15 +290,15 @@ fs_set_mntent (struct fs *fs, const struct mntent *mntent)
}
/* Copy MNTENT into FS; string-valued fields will be fixed up next. */
- fs->mntent = *mntent;
+ fs->mntent = mntent;
/* Copy each mntent field from MNTENT into FS's version. */
end = fs->storage;
#define STORE(field) \
- if (mntent->field) \
+ if (mntent.field) \
{ \
fs->mntent.field = end; \
- end = stpcpy (end, mntent->field) + 1; \
+ end = stpcpy (end, mntent.field) + 1; \
} \
else \
fs->mntent.field = 0;
@@ -289,10 +309,13 @@ fs_set_mntent (struct fs *fs, const struct mntent *mntent)
#undef STORE
if (fs->type
- && (!mntent->mnt_type
- || strcasecmp (fs->type->name, mntent->mnt_type) != 0))
+ && (!mntent.mnt_type
+ || strcasecmp (fs->type->name, mntent.mnt_type) != 0))
fs->type = 0; /* Type is different. */
+ free (real_fsname);
+ free (real_dir);
+
return 0;
}
@@ -470,11 +493,21 @@ fstab_find_device (const struct fstab *fstab, const char
*name)
if (strcmp (name, "none") == 0)
return NULL;
+ char *real_name = realpath (name, NULL);
+ const char *lookup_name;
+
+ if (real_name)
+ lookup_name = real_name;
+ else
+ lookup_name = name;
+
struct fs *fs;
for (fs = fstab->entries; fs; fs = fs->next)
- if (strcmp (fs->mntent.mnt_fsname, name) == 0)
- return fs;
- return 0;
+ if (strcmp (fs->mntent.mnt_fsname, lookup_name) == 0)
+ break;
+
+ free (real_name);
+ return fs;
}
/* Returns the FS entry in FSTAB with the mount point NAME (there can only
@@ -482,8 +515,6 @@ fstab_find_device (const struct fstab *fstab, const char
*name)
inline struct fs *
fstab_find_mount (const struct fstab *fstab, const char *name)
{
- struct fs *fs;
-
/* Don't count "none" or "-" as matching any other mount point.
It is canonical to use "none" for swap partitions, and multiple
such do not in fact conflict with each other. Likewise, the
@@ -494,10 +525,21 @@ fstab_find_mount (const struct fstab *fstab, const char
*name)
|| !strcmp (name, "ignore"))
return 0;
+ char *real_name = realpath (name, NULL);
+ const char *lookup_name;
+
+ if (real_name)
+ lookup_name = real_name;
+ else
+ lookup_name = name;
+
+ struct fs *fs;
for (fs = fstab->entries; fs; fs = fs->next)
- if (strcmp (fs->mntent.mnt_dir, name) == 0)
- return fs;
- return 0;
+ if (strcmp (fs->mntent.mnt_dir, lookup_name) == 0)
+ break;
+
+ free (real_name);
+ return fs;
}
/* Returns the FS entry in FSTAB with the device or mount point NAME (there
@@ -505,29 +547,7 @@ fstab_find_mount (const struct fstab *fstab, const char
*name)
inline struct fs *
fstab_find (const struct fstab *fstab, const char *name)
{
- struct fs *ret;
- char *real_name;
-
- ret = fstab_find_device (fstab, name);
- if (ret)
- return ret;
-
- ret = fstab_find_mount (fstab, name);
- if (ret)
- return ret;
-
- real_name = realpath (name, NULL);
-
- ret = fstab_find_device (fstab, real_name);
- if (ret) {
- free (real_name);
- return ret;
- }
-
- ret = fstab_find_mount (fstab, real_name);
- free (real_name);
-
- return ret;
+ return fstab_find_device (fstab, name) ?: fstab_find_mount (fstab, name);
}
/* Cons FS onto the beginning of FSTAB's entry list. */
@@ -690,6 +710,7 @@ fstab_read (struct fstab *fstab, const char *name)
{
while (!err && !feof (stream))
{
+ errno = 0;
struct mntent *mntent = getmntent (stream);
if (! mntent)
diff --git a/utils/umount.c b/utils/umount.c
index cf6be22..4005029 100644
--- a/utils/umount.c
+++ b/utils/umount.c
@@ -292,8 +292,6 @@ main (int argc, char **argv)
fs = fstab_find_device (fstab, t);
if (! fs)
{
- error (0, 0, "could not find entry for: %s", t);
-
/* As last resort, just assume it is the mountpoint. */
struct mntent m =
{
@@ -307,7 +305,7 @@ main (int argc, char **argv)
err = fstab_add_mntent (fstab, &m, &fs);
if (err)
- error (2, err, "%s", t);
+ error (2, err, "could not find entry for: %s", t);
}
}
--
Alioth's /usr/local/bin/git-commit-notice on
/srv/git.debian.org/git/pkg-hurd/hurd.git
- [hurd] branch upstream updated (e4a9a4d -> 4c7abe4), Samuel Thibault, 2014/12/10
- [hurd] 09/64: Fix recording complete path of passive relative translators, Samuel Thibault, 2014/12/10
- [hurd] 10/64: Fix compiler warning, Samuel Thibault, 2014/12/10
- [hurd] 12/64: trans/mtab: avoid firmlink loops, Samuel Thibault, 2014/12/10
- [hurd] 15/64: startup: rename /hurd/init to /hurd/startup, Samuel Thibault, 2014/12/10
- [hurd] 11/64: Always canonicalize fstab entries with realpath,
Samuel Thibault <=
- [hurd] 23/64: startup: also open `console' for reading, Samuel Thibault, 2014/12/10
- [hurd] 26/64: boot: drop obsolete device procedures, Samuel Thibault, 2014/12/10
- [hurd] 16/64: init: add a minimalist init program, Samuel Thibault, 2014/12/10
- [hurd] 22/64: proc: gracefully handle failure to increase priority, Samuel Thibault, 2014/12/10
- [hurd] 25/64: boot: remove unused function `boot_script_read_file', Samuel Thibault, 2014/12/10
- [hurd] 31/64: libdiskfs: fix fabrication of protid, Samuel Thibault, 2014/12/10
- [hurd] 17/64: startup: do not pass signals on to the child, Samuel Thibault, 2014/12/10
- [hurd] 29/64: boot: improve the demuxer, Samuel Thibault, 2014/12/10
- [hurd] 14/64: procfs: do not hard-code the default argument values, Samuel Thibault, 2014/12/10
- [hurd] 32/64: Fix proc crashes, Samuel Thibault, 2014/12/10