summaryrefslogtreecommitdiffstats
path: root/mount
diff options
context:
space:
mode:
authorKirill Elagin2011-07-11 12:53:43 +0200
committerKarel Zak2011-07-11 12:53:43 +0200
commit400459e897045b40eb3711fa4814176f7422a76a (patch)
tree1bab9553d4f3aad9f79c0e7c91d97336613f2d53 /mount
parentfdisk: use a single variable for the current disklabel (diff)
downloadkernel-qcow2-util-linux-400459e897045b40eb3711fa4814176f7422a76a.tar.gz
kernel-qcow2-util-linux-400459e897045b40eb3711fa4814176f7422a76a.tar.xz
kernel-qcow2-util-linux-400459e897045b40eb3711fa4814176f7422a76a.zip
mount: fix double free in mount.c with SELinux enabled
append_context reallocates memory, invalidating extra_opts1. As a result my_free(extra_opts1) crashes. Signed-off-by: Kirill Elagin <kirelagin@gmail.com> Signed-off-by: Nikita Ofitserov <himikof@gmail.com> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'mount')
-rw-r--r--mount/mount.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/mount/mount.c b/mount/mount.c
index cb04d9d36..ea2c47822 100644
--- a/mount/mount.c
+++ b/mount/mount.c
@@ -1535,7 +1535,7 @@ try_mount_one (const char *spec0, const char *node0, const char *types0,
struct stat statbuf;
/* copies for freeing on exit */
- const char *opts1, *spec1, *node1, *types1, *extra_opts1;
+ const char *opts1, *spec1, *node1, *types1;
if (verbose > 2) {
printf("mount: spec: \"%s\"\n", spec0);
@@ -1550,8 +1550,7 @@ try_mount_one (const char *spec0, const char *node0, const char *types0,
opts = opts1 = xstrdup(opts0);
parse_opts (opts, &flags, &extra_opts);
- extra_opts1 = extra_opts;
- mount_opts = extra_opts;
+ mount_opts = xstrdup(extra_opts);
/* quietly succeed for fstab entries that don't get mounted automatically */
if (mount_all && (flags & MS_NOAUTO))
@@ -1592,8 +1591,11 @@ try_mount_one (const char *spec0, const char *node0, const char *types0,
/*
* Linux kernel does not accept any selinux context option on remount
*/
- if (mount_opts)
+ if (mount_opts) {
+ char *tmp = mount_opts;
mount_opts = remove_context_options(mount_opts);
+ my_free(tmp);
+ }
} else if (types && strcmp(types, "tmpfs") == 0 && is_selinux_enabled() > 0 &&
!has_context_option(mount_opts)) {
@@ -1922,9 +1924,8 @@ try_mount_one (const char *spec0, const char *node0, const char *types0,
}
#endif
- if (extra_opts1 != mount_opts)
- my_free(mount_opts);
- my_free(extra_opts1);
+ my_free(mount_opts);
+ my_free(extra_opts);
my_free(spec1);
my_free(node1);
my_free(opts1);