]> git.pld-linux.org Git - packages/util-linux.git/blame - util-linux-2.12q-update_mtab-fixes.patch
- use functions
[packages/util-linux.git] / util-linux-2.12q-update_mtab-fixes.patch
CommitLineData
a160d850
ER
1This fixes a few issues with update_mtab():
2- If it is a remount, and only mnt_opts needs updating, mc->m.mnt_opts is set
3 to point to instead->mnt_opts, rather than allocating a new string, which
4 would cause a double free if the caller actually freed the passed mnt_opts,
5 as we free mc->m.mnt_opts before returning to the caller.
6- Mostly the same issue as above. If mtab does not contain the new entry, then
7 absent->m is set to point to instead, which would have cause a double free
8 if absent was inserted properly into the linked list, since we free all
9 elements of absent before returning to the caller.
10- If mtab does not contain the new entry, then only mc0->prev is updated to
11 point to absent, but not the old mc0->prev's nxt pointer. Because we then
12 use the nxt pointers to write the new mtab, absent is not added to the new
13 mtab.
14- If mtab is empty, absent->prev should be set to mc0, and not mc0->prev, as
15 it will be NULL.
16- Memory leak if we have to abort before mc0 and co are freed.
17
18Patch by Martin Schlemmer <azarah@gentoo.org>
19
20
21--- util-linux-2.12q/mount/fstab.c 2005-09-14 15:30:10.000000000 +0200
22+++ util-linux-2.12q.az/mount/fstab.c 2005-09-14 15:31:48.000000000 +0200
23@@ -604,15 +604,32 @@ update_mtab (const char *dir, struct my_
24 free(mc);
25 }
26 } else {
27- /* A remount */
28- mc->m.mnt_opts = instead->mnt_opts;
29+ /* A remount. */
30+ my_free(mc->m.mnt_opts);
31+ /* Need to alloc memory, else we might
32+ * run into issues if both we and the caller frees
33+ * mnt_opts ... */
34+ mc->m.mnt_opts = xstrdup(instead->mnt_opts);
35 }
36 } else if (instead) {
37 /* not found, add a new entry */
38 absent = xmalloc(sizeof(*absent));
39- absent->m = *instead;
40+ /* Cannot just set absent->m to instead, as we free absent
41+ * below, and the caller might free instead */
42+ absent->m.mnt_fsname = xstrdup(instead->mnt_fsname);
43+ absent->m.mnt_dir = xstrdup(instead->mnt_dir);
44+ absent->m.mnt_type = xstrdup(instead->mnt_type);
45+ absent->m.mnt_opts = xstrdup(instead->mnt_opts);
46+ absent->m.mnt_freq = instead->mnt_freq;
47+ absent->m.mnt_passno = instead->mnt_passno;
48+
49 absent->nxt = mc0;
50- absent->prev = mc0->prev;
51+ if (mc0->prev != NULL) {
52+ absent->prev = mc0->prev;
53+ mc0->prev->nxt = absent;
54+ } else {
55+ absent->prev = mc0;
56+ }
57 mc0->prev = absent;
58 if (mc0->nxt == NULL)
59 mc0->nxt = absent;
60@@ -624,6 +641,8 @@ update_mtab (const char *dir, struct my_
61 int errsv = errno;
62 error (_("cannot open %s (%s) - mtab not updated"),
63 MOUNTED_TEMP, strerror (errsv));
64+ /* Do not leak memory */
65+ discard_mntentchn(mc0);
66 goto leave;
67 }
68
This page took 0.032488 seconds and 4 git commands to generate.