82 lines
2.1 KiB
Diff
82 lines
2.1 KiB
Diff
|
From 9a8db9356c07d16a9337df416a3261c0527afeb7 Mon Sep 17 00:00:00 2001
|
||
|
From: Ondrej Mosnacek <omosnace@redhat.com>
|
||
|
Date: Tue, 26 Oct 2021 13:52:36 +0200
|
||
|
Subject: [PATCH] libselinux: make is_context_customizable() thread-safe
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
Use the __selinux_once() macro to ensure that threads don't race to
|
||
|
initialize the list of customizable types.
|
||
|
|
||
|
Reported-by: Christian Göttsche <cgzones@googlemail.com>
|
||
|
Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
|
||
|
Tested-by: Christian Göttsche <cgzones@googlemail.com>
|
||
|
---
|
||
|
libselinux/src/is_customizable_type.c | 23 +++++++++++------------
|
||
|
1 file changed, 11 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/libselinux/src/is_customizable_type.c b/libselinux/src/is_customizable_type.c
|
||
|
index 1b17860c3622..f83e1e83e944 100644
|
||
|
--- a/libselinux/src/is_customizable_type.c
|
||
|
+++ b/libselinux/src/is_customizable_type.c
|
||
|
@@ -9,7 +9,10 @@
|
||
|
#include "selinux_internal.h"
|
||
|
#include "context_internal.h"
|
||
|
|
||
|
-static int get_customizable_type_list(char *** retlist)
|
||
|
+static char **customizable_list = NULL;
|
||
|
+static pthread_once_t customizable_once = PTHREAD_ONCE_INIT;
|
||
|
+
|
||
|
+static void customizable_init(void)
|
||
|
{
|
||
|
FILE *fp;
|
||
|
char *buf;
|
||
|
@@ -18,12 +21,12 @@ static int get_customizable_type_list(char *** retlist)
|
||
|
|
||
|
fp = fopen(selinux_customizable_types_path(), "re");
|
||
|
if (!fp)
|
||
|
- return -1;
|
||
|
+ return;
|
||
|
|
||
|
buf = malloc(selinux_page_size);
|
||
|
if (!buf) {
|
||
|
fclose(fp);
|
||
|
- return -1;
|
||
|
+ return;
|
||
|
}
|
||
|
while (fgets_unlocked(buf, selinux_page_size, fp) && ctr < UINT_MAX) {
|
||
|
ctr++;
|
||
|
@@ -54,23 +57,19 @@ static int get_customizable_type_list(char *** retlist)
|
||
|
fclose(fp);
|
||
|
free(buf);
|
||
|
if (!list)
|
||
|
- return -1;
|
||
|
- *retlist = list;
|
||
|
- return 0;
|
||
|
+ return;
|
||
|
+ customizable_list = list;
|
||
|
}
|
||
|
|
||
|
-static char **customizable_list = NULL;
|
||
|
-
|
||
|
int is_context_customizable(const char * scontext)
|
||
|
{
|
||
|
int i;
|
||
|
const char *type;
|
||
|
context_t c;
|
||
|
|
||
|
- if (!customizable_list) {
|
||
|
- if (get_customizable_type_list(&customizable_list) != 0)
|
||
|
- return -1;
|
||
|
- }
|
||
|
+ __selinux_once(customizable_once, customizable_init);
|
||
|
+ if (!customizable_list)
|
||
|
+ return -1;
|
||
|
|
||
|
c = context_new(scontext);
|
||
|
if (!c)
|
||
|
--
|
||
|
2.33.1
|
||
|
|