aboutsummaryrefslogtreecommitdiffstats
path: root/libselinux/src/stringrep.c
diff options
context:
space:
mode:
Diffstat (limited to 'libselinux/src/stringrep.c')
-rw-r--r--libselinux/src/stringrep.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/libselinux/src/stringrep.c b/libselinux/src/stringrep.c
index b3f3120e..b19bce73 100644
--- a/libselinux/src/stringrep.c
+++ b/libselinux/src/stringrep.c
@@ -152,7 +152,25 @@ static const struct av_inherit {
#define NVECTORS ARRAY_SIZE(av_perm_to_string)
#define MAXVECTORS 8*sizeof(access_vector_t)
-extern int obj_class_compat;
+static pthread_once_t once = PTHREAD_ONCE_INIT;
+
+static int obj_class_compat;
+
+static void init_obj_class_compat(void)
+{
+ char path[PATH_MAX];
+ struct stat s;
+
+ if (!selinux_mnt)
+ return;
+
+ snprintf(path,PATH_MAX,"%s/class",selinux_mnt);
+ if (stat(path,&s) < 0)
+ return;
+
+ if (S_ISDIR(s.st_mode))
+ obj_class_compat = 0;
+}
struct discover_class_node {
char *name;
@@ -420,6 +438,8 @@ security_class_t string_to_security_class(const char *s)
{
struct discover_class_node *node;
+ __selinux_once(once, init_obj_class_compat);
+
if (obj_class_compat)
return string_to_security_class_compat(s);
@@ -441,6 +461,8 @@ access_vector_t string_to_av_perm(security_class_t tclass, const char *s)
struct discover_class_node *node;
security_class_t kclass = unmap_class(tclass);
+ __selinux_once(once, init_obj_class_compat);
+
if (obj_class_compat)
return map_perm(tclass, string_to_av_perm_compat(kclass, s));
@@ -462,6 +484,8 @@ const char *security_class_to_string(security_class_t tclass)
tclass = unmap_class(tclass);
+ __selinux_once(once, init_obj_class_compat);
+
if (obj_class_compat)
return security_class_to_string_compat(tclass);
@@ -481,6 +505,8 @@ const char *security_av_perm_to_string(security_class_t tclass,
av = unmap_perm(tclass, av);
tclass = unmap_class(tclass);
+ __selinux_once(once, init_obj_class_compat);
+
if (obj_class_compat)
return security_av_perm_to_string_compat(tclass,av);