On Wed, Jan 13, 2021 at 7:15 AM Petr Lautrbach <plautrba@xxxxxxxxxx> wrote: > > Commit 602347c7422e ("policycoreutils: setfiles - Modify to use > selinux_restorecon") changed behavior of setfiles. Original > implementation skipped files which it couldn't set context to while the > new implementation aborts on them. setfiles should abort only if it > can't validate 10 contexts from spec_file. > > Reproducer: > > # mkdir -p r/1 r/2 r/3 > # touch r/1/1 r/2/1 > # chattr +i r/2/1 > # touch r/3/1 > # setfiles -r r -v /etc/selinux/targeted/contexts/files/file_contexts r > Relabeled r from unconfined_u:object_r:mnt_t:s0 to unconfined_u:object_r:root_t:s0 > Relabeled r/2 from unconfined_u:object_r:mnt_t:s0 to unconfined_u:object_r:default_t:s0 > setfiles: Could not set context for r/2/1: Operation not permitted > > r/3 and r/1 are not relabeled. > > Also drop some old unused code in order to prevent future confusion. > > Signed-off-by: Petr Lautrbach <plautrba@xxxxxxxxxx> > --- > policycoreutils/setfiles/setfiles.c | 49 +---------------------------- > 1 file changed, 1 insertion(+), 48 deletions(-) > > diff --git a/policycoreutils/setfiles/setfiles.c b/policycoreutils/setfiles/setfiles.c > index 422c3767b845..b96ee814bad2 100644 > --- a/policycoreutils/setfiles/setfiles.c > +++ b/policycoreutils/setfiles/setfiles.c > @@ -23,14 +23,6 @@ static int nerr; > > #define STAT_BLOCK_SIZE 1 > > -/* setfiles will abort its operation after reaching the > - * following number of errors (e.g. invalid contexts), > - * unless it is used in "debug" mode (-d option). > - */ > -#ifndef ABORT_ON_ERRORS > -#define ABORT_ON_ERRORS 10 > -#endif > - > #define SETFILES "setfiles" > #define RESTORECON "restorecon" > static int iamrestorecon; > @@ -56,15 +48,6 @@ static __attribute__((__noreturn__)) void usage(const char *const name) > exit(-1); > } > > -void inc_err(void) > -{ > - nerr++; > - if (nerr > ABORT_ON_ERRORS - 1 && !r_opts.debug) { > - fprintf(stderr, "Exiting after %d errors.\n", ABORT_ON_ERRORS); > - exit(-1); > - } > -} > - > void set_rootpath(const char *arg) > { > if (strlen(arg) == 1 && strncmp(arg, "/", 1) == 0) { > @@ -82,27 +65,6 @@ void set_rootpath(const char *arg) > } > } > > -int canoncon(char **contextp) > -{ > - char *context = *contextp, *tmpcon; > - int rc = 0; > - > - if (policyfile) { > - if (sepol_check_context(context) < 0) { > - fprintf(stderr, "invalid context %s\n", context); > - exit(-1); > - } > - } else if (security_canonicalize_context_raw(context, &tmpcon) == 0) { > - free(context); > - *contextp = tmpcon; > - } else if (errno != ENOENT) { > - rc = -1; > - inc_err(); > - } > - > - return rc; > -} > - > #ifndef USE_AUDIT > static void maybe_audit_mass_relabel(int mass_relabel __attribute__((unused)), > int mass_relabel_errs __attribute__((unused))) > @@ -181,6 +143,7 @@ int main(int argc, char **argv) > policyfile = NULL; > nerr = 0; > > + r_opts.abort_on_error = 0; > r_opts.progname = strdup(argv[0]); > if (!r_opts.progname) { > fprintf(stderr, "%s: Out of memory!\n", argv[0]); > @@ -193,7 +156,6 @@ int main(int argc, char **argv) > * setfiles: > * Recursive descent, > * Does not expand paths via realpath, > - * Aborts on errors during the file tree walk, > * Try to track inode associations for conflict detection, > * Does not follow mounts (sets SELINUX_RESTORECON_XDEV), > * Validates all file contexts at init time. > @@ -201,7 +163,6 @@ int main(int argc, char **argv) > iamrestorecon = 0; > r_opts.recurse = SELINUX_RESTORECON_RECURSE; > r_opts.userealpath = 0; /* SELINUX_RESTORECON_REALPATH */ > - r_opts.abort_on_error = SELINUX_RESTORECON_ABORT_ON_ERROR; > r_opts.add_assoc = SELINUX_RESTORECON_ADD_ASSOC; > /* FTS_PHYSICAL and FTS_NOCHDIR are always set by selinux_restorecon(3) */ > r_opts.xdev = SELINUX_RESTORECON_XDEV; > @@ -225,7 +186,6 @@ int main(int argc, char **argv) > iamrestorecon = 1; > r_opts.recurse = 0; > r_opts.userealpath = SELINUX_RESTORECON_REALPATH; > - r_opts.abort_on_error = 0; > r_opts.add_assoc = 0; > r_opts.xdev = 0; > r_opts.ignore_mounts = 0; > @@ -420,13 +380,6 @@ int main(int argc, char **argv) > usage(argv[0]); > } > > - /* Use our own invalid context checking function so that > - * we can support either checking against the active policy or > - * checking against a binary policy file. > - */ > - cb.func_validate = canoncon; > - selinux_set_callback(SELINUX_CB_VALIDATE, cb); > - I could be wrong but I think we still need this for setfiles -c.