-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 This patch looks good to me. acked. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk7vrF8ACgkQrlYvE4MpobNLpgCgkFsZpBNIerijVKbK+7HN+X8e /pAAn0GoBBcEQVj91DUiuBqWAH/Pn+E4 =mmMM -----END PGP SIGNATURE-----
>From ed4d3ab52d0ce182c4577a2f8dc101da28c4aa45 Mon Sep 17 00:00:00 2001 From: Dan Walsh <dwalsh@xxxxxxxxxx> Date: Wed, 7 Sep 2011 13:58:24 -0400 Subject: [PATCH 18/25] policycoreutils: FIXME Change restorecon to just change the type of an object, rather then the role, user and range. Needs review. Signed-off-by: Dan Walsh <dwalsh@xxxxxxxxxx> NOT-Signed-off-by: Eric Paris <eparis@xxxxxxxxxx> --- policycoreutils/setfiles/restore.c | 113 +++++++++++++++++++-------------- policycoreutils/setfiles/restorecon.8 | 12 ++-- policycoreutils/setfiles/setfiles.8 | 14 +++-- 3 files changed, 80 insertions(+), 59 deletions(-) diff --git a/policycoreutils/setfiles/restore.c b/policycoreutils/setfiles/restore.c index d6f9b7c..e57d34f 100644 --- a/policycoreutils/setfiles/restore.c +++ b/policycoreutils/setfiles/restore.c @@ -1,5 +1,6 @@ #include "restore.h" #include <glob.h> +#include <selinux/context.h> #define SKIP -2 #define ERR -1 @@ -33,7 +34,6 @@ struct edir { static file_spec_t *fl_head; static int filespec_add(ino_t ino, const security_context_t con, const char *file); -static int only_changed_user(const char *a, const char *b); struct restore_opts *r_opts = NULL; static void filespec_destroy(void); static void filespec_eval(void); @@ -109,8 +109,7 @@ static int restore(FTSENT *ftsent) { char *my_file = strdupa(ftsent->fts_path); int ret = -1; - char *context, *newcon; - int user_only_changed = 0; + security_context_t curcon = NULL, newcon = NULL; if (match(my_file, ftsent->fts_statp, &newcon) < 0) /* Check for no matching specification. */ @@ -144,74 +143,105 @@ static int restore(FTSENT *ftsent) printf("%s: %s matched by %s\n", r_opts->progname, my_file, newcon); } + /* + * Do not relabel if their is no default specification for this file + */ + + if (strcmp(newcon, "<<none>>") == 0) { + goto out; + } + /* Get the current context of the file. */ - ret = lgetfilecon_raw(ftsent->fts_accpath, &context); + ret = lgetfilecon_raw(ftsent->fts_accpath, &curcon); if (ret < 0) { if (errno == ENODATA) { - context = NULL; + curcon = NULL; } else { fprintf(stderr, "%s get context on %s failed: '%s'\n", r_opts->progname, my_file, strerror(errno)); goto err; } - user_only_changed = 0; - } else - user_only_changed = only_changed_user(context, newcon); + } + /* lgetfilecon returns number of characters and ret needs to be reset * to 0. */ ret = 0; /* - * Do not relabel the file if the matching specification is - * <<none>> or the file is already labeled according to the - * specification. + * Do not relabel the file if the file is already labeled according to + * the specification. */ - if ((strcmp(newcon, "<<none>>") == 0) || - (context && (strcmp(context, newcon) == 0))) { - freecon(context); + if (curcon && (strcmp(curcon, newcon) == 0)) { goto out; } - if (!r_opts->force && context && (is_context_customizable(context) > 0)) { + if (!r_opts->force && curcon && (is_context_customizable(curcon) > 0)) { if (r_opts->verbose > 1) { fprintf(stderr, "%s: %s not reset customized by admin to %s\n", - r_opts->progname, my_file, context); + r_opts->progname, my_file, curcon); } - freecon(context); goto out; } - if (r_opts->verbose) { - /* If we're just doing "-v", trim out any relabels where - * the user has r_opts->changed but the role and type are the - * same. For "-vv", emit everything. */ - if (r_opts->verbose > 1 || !user_only_changed) { - printf("%s reset %s context %s->%s\n", - r_opts->progname, my_file, context ?: "", newcon); + /* + * Do not change label unless this is a force or the type is different + */ + if (!r_opts->force && curcon) { + int types_differ = 0; + context_t cona; + context_t conb; + int err = 0; + cona = context_new(curcon); + if (! cona) { + goto out; + } + conb = context_new(newcon); + if (! conb) { + context_free(cona); + goto out; + } + + types_differ = strcmp(context_type_get(cona), context_type_get(conb)); + if (types_differ) { + err |= context_user_set(conb, context_user_get(cona)); + err |= context_role_set(conb, context_role_get(cona)); + err |= context_range_set(conb, context_range_get(cona)); + if (!err) { + freecon(newcon); + newcon = strdup(context_str(conb)); + } + } + context_free(cona); + context_free(conb); + + if (!types_differ || err) { + goto out; } } - if (r_opts->logging && !user_only_changed) { - if (context) + if (r_opts->verbose) { + printf("%s reset %s context %s->%s\n", + r_opts->progname, my_file, curcon ?: "", newcon); + } + + if (r_opts->logging) { + if (curcon) syslog(LOG_INFO, "relabeling %s from %s to %s\n", - my_file, context, newcon); + my_file, curcon, newcon); else syslog(LOG_INFO, "labeling %s to %s\n", my_file, newcon); } - if (r_opts->outfile && !user_only_changed) + if (r_opts->outfile) fprintf(r_opts->outfile, "%s\n", my_file); - if (context) - freecon(context); - /* * Do not relabel the file if -n was used. */ - if (!r_opts->change || user_only_changed) + if (!r_opts->change) goto out; /* @@ -225,12 +255,15 @@ static int restore(FTSENT *ftsent) } ret = 1; out: + freecon(curcon); freecon(newcon); return ret; skip: + freecon(curcon); freecon(newcon); return SKIP; err: + freecon(curcon); freecon(newcon); return ERR; } @@ -452,22 +485,6 @@ int add_exclude(const char *directory) return 0; } -/* Compare two contexts to see if their differences are "significant", - * or whether the only difference is in the user. */ -static int only_changed_user(const char *a, const char *b) -{ - char *rest_a, *rest_b; /* Rest of the context after the user */ - if (r_opts->force) - return 0; - if (!a || !b) - return 0; - rest_a = strchr(a, ':'); - rest_b = strchr(b, ':'); - if (!rest_a || !rest_b) - return 0; - return (strcmp(rest_a, rest_b) == 0); -} - /* * Evaluate the association hash table distribution. */ diff --git a/policycoreutils/setfiles/restorecon.8 b/policycoreutils/setfiles/restorecon.8 index ab2657f..65a59de 100644 --- a/policycoreutils/setfiles/restorecon.8 +++ b/policycoreutils/setfiles/restorecon.8 @@ -14,12 +14,17 @@ This manual page describes the .BR restorecon program. .P -This program is primarily used to set the security context +This program is primarily used to reset the security context (type) (extended attributes) on one or more files. .P It can be run at any time to correct errors, to add support for new policy, or with the \-n option it can just check whether the file contexts are all as you expect. +.P +If a file object does not have a context, restorecon will write the default +context to the file object's extended attributes. If a file object has a +context, restorecon will only modify the type portion of the security context. +The -F option will force a replacement of the entire context. .SH "OPTIONS" .TP @@ -53,11 +58,8 @@ show progress by printing * every 1000 files. .B \-v show changes in file labels. .TP -.B \-vv -show changes in file labels, if type, role, or user are changing. -.TP .B \-F -Force reset of context to match file_context for customizable files, or the user section, if it has changed. +Force reset of context to match file_context for customizable files, and the default file context, changing the user, role, range portion as well as the type. .TP .SH "ARGUMENTS" .B pathname... diff --git a/policycoreutils/setfiles/setfiles.8 b/policycoreutils/setfiles/setfiles.8 index 93eaa8e..2741919 100644 --- a/policycoreutils/setfiles/setfiles.8 +++ b/policycoreutils/setfiles/setfiles.8 @@ -4,7 +4,7 @@ setfiles \- set file SELinux security contexts. .SH "SYNOPSIS" .B setfiles -.I [\-c policy ] [\-d] [\-l] [\-n] [\-e directory ] [\-o filename ] [\-L labelprefix ] [\-q] [\-s] [\-v] [\-vv] [\-W] [\-F] spec_file pathname... +.I [\-c policy ] [\-d] [\-l] [\-n] [\-e directory ] [\-o filename ] [\-L labelprefix ] [\-q] [\-s] [\-v] [\-W] [\-F] spec_file pathname... .SH "DESCRIPTION" This manual page describes the .BR setfiles @@ -17,6 +17,11 @@ program is initially run as part of the SE Linux installation process. It can also be run at any time to correct errors, to add support for new policy, or with the \-n option it can just check whether the file contexts are all as you expect. +.P +If a file object does not have a context, setfiles will write the default +context to the file object's extended attributes. If a file object has a +context, setfiles will only modify the type portion of the security context. +The -F option will force a replacement of the entire context. .SH "OPTIONS" .TP @@ -45,7 +50,7 @@ use an alternate root path directory to exclude (repeat option for more than one directory.) .TP .B \-F -Force reset of context to match file_context for customizable files +Force reset of context to match file_context for customizable files, and the default file context, changing the user, role, range portion as well as the type. .TP .B \-L labelprefix Tells selinux to only use the file context that match this prefix for labeling, -L can be called multiple times. Can speed up labeling if you are only doing one directory. @@ -58,10 +63,7 @@ take a list of files from standard input instead of using a pathname on the command line. .TP .B \-v -show changes in file labels, if type or role are changing. -.TP -.B \-vv -show changes in file labels, if type, role, or user are changing. +show changes in file labels. .TP .B \-W display warnings about entries that had no matching files. -- 1.7.8