aboutsummaryrefslogtreecommitdiffstats
path: root/libselinux/src/label.c
diff options
context:
space:
mode:
Diffstat (limited to 'libselinux/src/label.c')
-rw-r--r--libselinux/src/label.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/libselinux/src/label.c b/libselinux/src/label.c
index 48f4d2d6..c051e9f9 100644
--- a/libselinux/src/label.c
+++ b/libselinux/src/label.c
@@ -17,6 +17,12 @@
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#ifdef NO_FILE_BACKEND
+#define CONFIG_FILE_BACKEND(fnptr) NULL
+#else
+#define CONFIG_FILE_BACKEND(fnptr) &fnptr
+#endif
+
#ifdef NO_MEDIA_BACKEND
#define CONFIG_MEDIA_BACKEND(fnptr) NULL
#else
@@ -46,7 +52,7 @@ typedef int (*selabel_initfunc)(struct selabel_handle *rec,
unsigned nopts);
static selabel_initfunc initfuncs[] = {
- &selabel_file_init,
+ CONFIG_FILE_BACKEND(selabel_file_init),
CONFIG_MEDIA_BACKEND(selabel_media_init),
CONFIG_X_BACKEND(selabel_x_init),
CONFIG_DB_BACKEND(selabel_db_init),
@@ -143,7 +149,11 @@ static int selabel_fini(struct selabel_handle *rec,
struct selabel_lookup_rec *lr,
int translating)
{
- if (compat_validate(rec, lr, rec->spec_file, 0))
+ char *path = NULL;
+
+ if (rec->spec_files)
+ path = rec->spec_files[0];
+ if (compat_validate(rec, lr, path, 0))
return -1;
if (translating && !lr->ctx_trans &&
@@ -226,11 +236,9 @@ struct selabel_handle *selabel_open(unsigned int backend,
rec->digest = selabel_is_digest_set(opts, nopts, rec->digest);
if ((*initfuncs[backend])(rec, opts, nopts)) {
- free(rec->spec_file);
- free(rec);
+ selabel_close(rec);
rec = NULL;
}
-
out:
return rec;
}
@@ -337,10 +345,17 @@ int selabel_digest(struct selabel_handle *rec,
void selabel_close(struct selabel_handle *rec)
{
+ size_t i;
+
+ if (rec->spec_files) {
+ for (i = 0; i < rec->spec_files_len; i++)
+ free(rec->spec_files[i]);
+ free(rec->spec_files);
+ }
if (rec->digest)
selabel_digest_fini(rec->digest);
- rec->func_close(rec);
- free(rec->spec_file);
+ if (rec->func_close)
+ rec->func_close(rec);
free(rec);
}