summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2011-07-12 03:32:10 +0000
committerMike Frysinger <vapier@gentoo.org>2011-07-12 03:32:10 +0000
commitf524f137a3bd0dfcecdb29dd7163f164a6414834 (patch)
treea93131ff294379abee8d9accafc38fbd1a0def63 /sys-apps/util-linux/files
parentVersion bump. Update to EAPI 4, remove old kernel version warning, use system... (diff)
downloadgentoo-2-f524f137a3bd0dfcecdb29dd7163f164a6414834.tar.gz
gentoo-2-f524f137a3bd0dfcecdb29dd7163f164a6414834.tar.bz2
gentoo-2-f524f137a3bd0dfcecdb29dd7163f164a6414834.zip
Add fixes from upstream for `mount -a` segfault #366213 and `umount -l` stalls #370051 by Pacho Ramos.
(Portage version: 2.2.0_alpha43/cvs/Linux x86_64)
Diffstat (limited to 'sys-apps/util-linux/files')
-rw-r--r--sys-apps/util-linux/files/util-linux-2.19.1-mount-a-segv.patch86
-rw-r--r--sys-apps/util-linux/files/util-linux-2.19.1-umount-l-nfs.patch92
2 files changed, 178 insertions, 0 deletions
diff --git a/sys-apps/util-linux/files/util-linux-2.19.1-mount-a-segv.patch b/sys-apps/util-linux/files/util-linux-2.19.1-mount-a-segv.patch
new file mode 100644
index 000000000000..1f358bafe3c7
--- /dev/null
+++ b/sys-apps/util-linux/files/util-linux-2.19.1-mount-a-segv.patch
@@ -0,0 +1,86 @@
+https://bugs.gentoo.org/366213
+
+From f53edda83ebcfd7015c3f35196d6cbd7bc2d8369 Mon Sep 17 00:00:00 2001
+From: Karel Zak <kzak@redhat.com>
+Date: Wed, 11 May 2011 16:57:27 +0200
+Subject: [PATCH] mount: -a segfaults when 4th field is omitted (mount
+ options)
+
+ # echo 'tmpd /tmp/x tmpfs' >> /etc/fstab
+ # mkdir /tmp/x
+ # mount -a
+ segfault
+
+Reported-by: Mike Frysinger <vapier@gentoo.org>
+Signed-off-by: Karel Zak <kzak@redhat.com>
+---
+ mount/mount.c | 8 +++++---
+ mount/mount_mntent.c | 5 +++--
+ mount/sundries.c | 2 ++
+ 3 files changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/mount/mount.c b/mount/mount.c
+index ba71149..29963c2 100644
+--- a/mount/mount.c
++++ b/mount/mount.c
+@@ -1163,7 +1163,9 @@ is_mounted_same_loopfile(const char *node0, const char *loopfile, unsigned long
+ res = loopfile_used_with((char *) mnt->m.mnt_fsname,
+ loopfile, offset);
+
+- else if ((p = strstr(mnt->m.mnt_opts, "loop="))) {
++ else if (mnt->m.mnt_opts &&
++ (p = strstr(mnt->m.mnt_opts, "loop=")))
++ {
+ char *dev = xstrdup(p+5);
+ if ((p = strchr(dev, ',')))
+ *p = '\0';
+@@ -2052,8 +2054,8 @@ is_fstab_entry_mounted(struct mntentchn *mc, int verbose)
+ goto yes;
+
+ /* extra care for loop devices */
+- if ((strstr(mc->m.mnt_opts, "loop=") ||
+- (stat(mc->m.mnt_fsname, &st) == 0 && S_ISREG(st.st_mode)))) {
++ if ((mc->m.mnt_opts && strstr(mc->m.mnt_opts, "loop=")) ||
++ (stat(mc->m.mnt_fsname, &st) == 0 && S_ISREG(st.st_mode))) {
+
+ char *p = get_option_value(mc->m.mnt_opts, "offset=");
+ uintmax_t offset = 0;
+diff --git a/mount/mount_mntent.c b/mount/mount_mntent.c
+index d90def3..f42c0ad 100644
+--- a/mount/mount_mntent.c
++++ b/mount/mount_mntent.c
+@@ -70,7 +70,7 @@ my_addmntent (mntFILE *mfp, struct my_mntent *mnt) {
+ m1 = mangle(mnt->mnt_fsname);
+ m2 = mangle(mnt->mnt_dir);
+ m3 = mangle(mnt->mnt_type);
+- m4 = mangle(mnt->mnt_opts);
++ m4 = mnt->mnt_opts ? mangle(mnt->mnt_opts) : "rw";
+
+ res = fprintf (mfp->mntent_fp, "%s %s %s %s %d %d\n",
+ m1, m2, m3, m4, mnt->mnt_freq, mnt->mnt_passno);
+@@ -78,7 +78,8 @@ my_addmntent (mntFILE *mfp, struct my_mntent *mnt) {
+ free(m1);
+ free(m2);
+ free(m3);
+- free(m4);
++ if (mnt->mnt_opts)
++ free(m4);
+ return (res < 0) ? 1 : 0;
+ }
+
+diff --git a/mount/sundries.c b/mount/sundries.c
+index ae4501a..2dec37f 100644
+--- a/mount/sundries.c
++++ b/mount/sundries.c
+@@ -217,6 +217,8 @@ matching_opts (const char *options, const char *test_opts) {
+
+ if (test_opts == NULL)
+ return 1;
++ if (options == NULL)
++ options = "";
+
+ len = strlen(test_opts);
+ q = alloca(len+1);
+--
+1.7.6
+
diff --git a/sys-apps/util-linux/files/util-linux-2.19.1-umount-l-nfs.patch b/sys-apps/util-linux/files/util-linux-2.19.1-umount-l-nfs.patch
new file mode 100644
index 000000000000..72ec3aa736b9
--- /dev/null
+++ b/sys-apps/util-linux/files/util-linux-2.19.1-umount-l-nfs.patch
@@ -0,0 +1,92 @@
+https://bugs.gentoo.org/370051
+
+From b3b0c657818aa6191e6494f88d671601dd9d837d Mon Sep 17 00:00:00 2001
+From: Petr Uzel <petr.uzel@suse.cz>
+Date: Wed, 29 Jun 2011 10:24:09 +0200
+Subject: [PATCH] umount: do not hang with disconnected NFS mounts
+
+Since util-linux commit f4612577c942a3683b97632ad0b49671897c2070,
+umount stat(2)s its argument to check whether it can be associated
+with some loop device. This could hang with broken NFS mounts.
+
+Fix by first checking mtab if umount's argument is mounted and only if
+we fail, check if there is a loop device associated.
+
+http://marc.info/?l=util-linux-ng&m=130924963804836&w=2
+
+Reported-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
+Signed-off-by: Petr Uzel <petr.uzel@suse.cz>
+---
+ mount/umount.c | 42 ++++++++++++++++++++++--------------------
+ 1 files changed, 22 insertions(+), 20 deletions(-)
+
+diff --git a/mount/umount.c b/mount/umount.c
+index 0349cb3..96c940e 100644
+--- a/mount/umount.c
++++ b/mount/umount.c
+@@ -600,6 +600,7 @@ umount_file (char *arg) {
+ int fstab_has_user, fstab_has_users, fstab_has_owner, fstab_has_group;
+ int ok, status = 0;
+ struct stat statbuf;
++ char *loopdev = NULL;
+
+ if (!*arg) { /* "" would be expanded to `pwd` */
+ die(2, _("Cannot unmount \"\"\n"));
+@@ -608,26 +609,7 @@ umount_file (char *arg) {
+
+ file = canonicalize(arg); /* mtab paths are canonicalized */
+
+- /* if file is a regular file, check if it is associated
+- * with some loop device
+- */
+- if (!stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
+- char *loopdev = NULL;
+- switch (find_loopdev_by_backing_file(file, &loopdev)) {
+- case 0:
+- if (verbose)
+- printf(_("%s is associated with %s, trying to unmount it\n"),
+- arg, loopdev);
+- file = loopdev;
+- break;
+- case 2:
+- if (verbose)
+- printf(_("%s is associated with more than one loop device: not unmounting\n"),
+- arg);
+- break;
+- }
+- }
+-
++try_loopdev:
+ if (verbose > 1)
+ printf(_("Trying to unmount %s\n"), file);
+
+@@ -659,6 +641,26 @@ umount_file (char *arg) {
+ if (!mc && verbose)
+ printf(_("Could not find %s in mtab\n"), file);
+
++ /* not found in mtab - check if it is associated with some loop device
++ * (only if it is a regular file)
++ */
++ if (!mc && !loopdev && !stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
++ switch (find_loopdev_by_backing_file(file, &loopdev)) {
++ case 0:
++ if (verbose)
++ printf(_("%s is associated with %s\n"),
++ arg, loopdev);
++ file = loopdev;
++ goto try_loopdev;
++ break;
++ case 2:
++ if (verbose)
++ printf(_("%s is associated with more than one loop device: not unmounting\n"),
++ arg);
++ break;
++ }
++ }
++
+ if (restricted) {
+ char *mtab_user = NULL;
+
+--
+1.7.6
+