|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
From ec300fdabb27c41258cf5aea91dae518a3b88a04 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
Date: Mon, 21 Jul 2014 20:41:19 -0400
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
Subject: [PATCH] sysusers: fix selinux context of backup files
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
Also, fix fopen_temporary_label to set proper context. By chance,
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
all users so far used the same context, so the error didn't matter.
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
Also, check return value from label_init().
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
https://bugzilla.redhat.com/show_bug.cgi?id=1121806
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
(cherry picked from commit 9f1c19405a1ccaf59dcc8c32c13a1619541189ad)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
src/shared/fileio-label.c | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
src/sysusers/sysusers.c | 45 ++++++++++++++++++++++++---------------------
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
2 files changed, 25 insertions(+), 22 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
diff --git a/src/shared/fileio-label.c b/src/shared/fileio-label.c
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
index 417ca5695a..c3def3c568 100644
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
--- a/src/shared/fileio-label.c
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+++ b/src/shared/fileio-label.c
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
@@ -59,7 +59,7 @@ int fopen_temporary_label(const char *target,
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
const char *path, FILE **f, char **temp_path) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- r = label_context_set("/etc/passwd", S_IFREG);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ r = label_context_set(target, S_IFREG);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
index bf2fbbc252..2387d5873a 100644
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
--- a/src/sysusers/sysusers.c
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+++ b/src/sysusers/sysusers.c
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
@@ -195,8 +195,9 @@ static int load_group_database(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
-static int make_backup(const char *x) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- _cleanup_close_ int src = -1, dst = -1;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+static int make_backup(const char *target, const char *x) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ _cleanup_close_ int src = -1;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ _cleanup_fclose_ FILE *dst = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
char *backup, *temp;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
struct timespec ts[2];
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
struct stat st;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
@@ -213,30 +214,30 @@ static int make_backup(const char *x) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (fstat(src, &st) < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- temp = strappenda(x, ".XXXXXX");
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- dst = mkostemp_safe(temp, O_WRONLY|O_CLOEXEC|O_NOCTTY);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- if (dst < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- return dst;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ r = fopen_temporary_label(target, x, &dst, &temp);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- r = copy_bytes(src, dst, (off_t) -1);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ r = copy_bytes(src, fileno(dst), (off_t) -1);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
goto fail;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ /* Don't fail on chmod() or chown(). If it stays owned by us
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ * and/or unreadable by others, then it isn't too bad... */
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ backup = strappenda(x, "-");
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
/* Copy over the access mask */
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- if (fchmod(dst, st.st_mode & 07777) < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- r = -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- goto fail;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ if (fchmod(fileno(dst), st.st_mode & 07777) < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ log_warning("Failed to change mode on %s: %m", backup);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- /* Don't fail on chmod(). If it stays owned by us, then it
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- * isn't too bad... */
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- fchown(dst, st.st_uid, st.st_gid);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ if (fchown(fileno(dst), st.st_uid, st.st_gid)< 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ log_warning("Failed to change ownership of %s: %m", backup);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
ts[0] = st.st_atim;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
ts[1] = st.st_mtim;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- futimens(dst, ts);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ futimens(fileno(dst), ts);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- backup = strappenda(x, "-");
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (rename(temp, backup) < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
goto fail;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
@@ -469,13 +470,13 @@ static int write_files(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
/* Make a backup of the old files */
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (group && group_changed) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- r = make_backup(group_path);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ r = make_backup("/etc/group", group_path);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (passwd) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- r = make_backup(passwd_path);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ r = make_backup("/etc/passwd", passwd_path);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
@@ -1529,9 +1530,11 @@ int main(int argc, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
umask(0022);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- label_init(NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
- r = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ r = label_init(NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ log_error("SELinux setup failed: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
if (optind < argc) {
|
|
Zbigniew Jędrzejewski-Szmek |
dc60e8 |
int j;
|