summaryrefslogtreecommitdiffstats
path: root/sys-apps/util-linux/files/util-linux-2.12q-update_mtab-fixes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-apps/util-linux/files/util-linux-2.12q-update_mtab-fixes.patch')
-rw-r--r--sys-apps/util-linux/files/util-linux-2.12q-update_mtab-fixes.patch68
1 files changed, 0 insertions, 68 deletions
diff --git a/sys-apps/util-linux/files/util-linux-2.12q-update_mtab-fixes.patch b/sys-apps/util-linux/files/util-linux-2.12q-update_mtab-fixes.patch
deleted file mode 100644
index 7e1c9db..0000000
--- a/sys-apps/util-linux/files/util-linux-2.12q-update_mtab-fixes.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-This fixes a few issues with update_mtab():
-- If it is a remount, and only mnt_opts needs updating, mc->m.mnt_opts is set
- to point to instead->mnt_opts, rather than allocating a new string, which
- would cause a double free if the caller actually freed the passed mnt_opts,
- as we free mc->m.mnt_opts before returning to the caller.
-- Mostly the same issue as above. If mtab does not contain the new entry, then
- absent->m is set to point to instead, which would have cause a double free
- if absent was inserted properly into the linked list, since we free all
- elements of absent before returning to the caller.
-- If mtab does not contain the new entry, then only mc0->prev is updated to
- point to absent, but not the old mc0->prev's nxt pointer. Because we then
- use the nxt pointers to write the new mtab, absent is not added to the new
- mtab.
-- If mtab is empty, absent->prev should be set to mc0, and not mc0->prev, as
- it will be NULL.
-- Memory leak if we have to abort before mc0 and co are freed.
-
-Patch by Martin Schlemmer <azarah@gentoo.org>
-
-
---- util-linux-2.12q/mount/fstab.c 2005-09-14 15:30:10.000000000 +0200
-+++ util-linux-2.12q.az/mount/fstab.c 2005-09-14 15:31:48.000000000 +0200
-@@ -604,15 +604,32 @@ update_mtab (const char *dir, struct my_
- free(mc);
- }
- } else {
-- /* A remount */
-- mc->m.mnt_opts = instead->mnt_opts;
-+ /* A remount. */
-+ my_free(mc->m.mnt_opts);
-+ /* Need to alloc memory, else we might
-+ * run into issues if both we and the caller frees
-+ * mnt_opts ... */
-+ mc->m.mnt_opts = xstrdup(instead->mnt_opts);
- }
- } else if (instead) {
- /* not found, add a new entry */
- absent = xmalloc(sizeof(*absent));
-- absent->m = *instead;
-+ /* Cannot just set absent->m to instead, as we free absent
-+ * below, and the caller might free instead */
-+ absent->m.mnt_fsname = xstrdup(instead->mnt_fsname);
-+ absent->m.mnt_dir = xstrdup(instead->mnt_dir);
-+ absent->m.mnt_type = xstrdup(instead->mnt_type);
-+ absent->m.mnt_opts = xstrdup(instead->mnt_opts);
-+ absent->m.mnt_freq = instead->mnt_freq;
-+ absent->m.mnt_passno = instead->mnt_passno;
-+
- absent->nxt = mc0;
-- absent->prev = mc0->prev;
-+ if (mc0->prev != NULL) {
-+ absent->prev = mc0->prev;
-+ mc0->prev->nxt = absent;
-+ } else {
-+ absent->prev = mc0;
-+ }
- mc0->prev = absent;
- if (mc0->nxt == NULL)
- mc0->nxt = absent;
-@@ -624,6 +641,8 @@ update_mtab (const char *dir, struct my_
- int errsv = errno;
- error (_("cannot open %s (%s) - mtab not updated"),
- MOUNTED_TEMP, strerror (errsv));
-+ /* Do not leak memory */
-+ discard_mntentchn(mc0);
- goto leave;
- }
-