aboutsummaryrefslogtreecommitdiffstats
path: root/src/selinux.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/selinux.c')
-rw-r--r--src/selinux.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/selinux.c b/src/selinux.c
index 50efb0aec..92b6b6b52 100644
--- a/src/selinux.c
+++ b/src/selinux.c
@@ -21,7 +21,6 @@
#include <selinux/context.h>
#include <sys/types.h>
-#include "die.h"
#include "system.h"
#include "canonicalize.h"
#include "xfts.h"
@@ -89,10 +88,12 @@ computecon (char const *path, mode_t mode, char **con)
goto quit;
rc = security_compute_create (scon, tcon, tclass, con);
-quit:
+ quit:;
+ int err = errno;
free (dir);
freecon (scon);
freecon (tcon);
+ errno = err;
return rc;
}
@@ -119,10 +120,10 @@ defaultcon (struct selabel_handle *selabel_handle,
if (! IS_ABSOLUTE_FILE_NAME (path))
{
+ /* Generate absolute name as required by subsequent selabel_lookup. */
newpath = canonicalize_filename_mode (path, CAN_MISSING);
if (! newpath)
- die (EXIT_FAILURE, errno, _("error canonicalizing %s"),
- quoteaf (path));
+ goto quit;
path = newpath;
}
@@ -153,12 +154,14 @@ defaultcon (struct selabel_handle *selabel_handle,
rc = setfscreatecon (constr);
-quit:
+ quit:;
+ int err = errno;
context_free (scontext);
context_free (tcontext);
freecon (scon);
freecon (tcon);
free (newpath);
+ errno = err;
return rc;
}
@@ -286,17 +289,21 @@ restorecon (struct selabel_handle *selabel_handle,
if (! IS_ABSOLUTE_FILE_NAME (path))
{
+ /* Generate absolute name as required by subsequent selabel_lookup.
+ When RECURSE, this also generates absolute names in the
+ fts entries, which may be quicker to process in any case. */
newpath = canonicalize_filename_mode (path, CAN_MISSING);
if (! newpath)
- die (EXIT_FAILURE, errno, _("error canonicalizing %s"),
- quoteaf (path));
+ return false;
path = newpath;
}
if (! recurse)
{
bool ok = restorecon_private (selabel_handle, path) != -1;
+ int err = errno;
free (newpath);
+ errno = err;
return ok;
}