summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaiGai Kohei2007-10-22 10:30:19 +0200
committerKarel Zak2007-10-25 21:50:36 +0200
commit71bf78844425d228de76db36c2f97e542c4c54fe (patch)
tree2477d9a347d02c60756f855e6a6de90abd7fb056
parentbuild-sys: add v2.14 to NEWS (diff)
downloadkernel-qcow2-util-linux-71bf78844425d228de76db36c2f97e542c4c54fe.tar.gz
kernel-qcow2-util-linux-71bf78844425d228de76db36c2f97e542c4c54fe.tar.xz
kernel-qcow2-util-linux-71bf78844425d228de76db36c2f97e542c4c54fe.zip
mkswap: possible to crash with SELinux relabeling support
When fgetfilecon() is failed with -ENODATA, this process does not exit. However, "oldcontext" is not initialized in this case, so context_new() will be called with uninitialized "oldcontext" at the next. Finally, it makes a segmentation fault, because context_new() have to refer an incorrect memory region. The attached patch fixes this matter using matchpathcon(). If we cannot obtain actual file context due to -ENODATA, a context which is returned by matchpathcon() is applied as oldcontext. Then, the type of the context is relabeled to "swapfile_t" explicitly. Signed-off-by: KaiGai Kohei <kaigai@kaigai.gr.jp> Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--disk-utils/mkswap.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c
index 6af1ff7bb..2394368b7 100644
--- a/disk-utils/mkswap.c
+++ b/disk-utils/mkswap.c
@@ -738,12 +738,15 @@ the -f option to force it.\n"),
security_context_t oldcontext;
context_t newcontext;
- if ((fgetfilecon(DEV, &oldcontext) < 0) &&
- (errno != ENODATA)) {
- fprintf(stderr, _("%s: %s: unable to obtain selinux file label: %s\n"),
- program_name, device_name,
- strerror(errno));
- exit(1);
+ if (fgetfilecon(DEV, &oldcontext) < 0) {
+ if (errno != ENODATA) {
+ fprintf(stderr, _("%s: %s: unable to obtain selinux file label: %s\n"),
+ program_name, device_name,
+ strerror(errno));
+ exit(1);
+ }
+ if (matchpathcon(device_name, statbuf.st_mode, &oldcontext))
+ die(_("unable to matchpathcon()"));
}
if (!(newcontext = context_new(oldcontext)))
die(_("unable to create new selinux context"));