--- libselinux-2.0.65.orig/src/setrans_client.c 2007-09-28 21:09:13.000000000 +0200 +++ libselinux-2.0.65/src/setrans_client.c 2009-01-20 17:26:33.000000000 +0100 @@ -18,6 +18,7 @@ #include #include #include +#include #include "dso.h" #include "selinux_internal.h" #include "setrans_internal.h" @@ -26,10 +27,10 @@ static int mls_enabled = -1; // Simple cache -static __thread security_context_t prev_t2r_trans = NULL; -static __thread security_context_t prev_t2r_raw = NULL; -static __thread security_context_t prev_r2t_trans = NULL; -static __thread security_context_t prev_r2t_raw = NULL; +static security_context_t prev_t2r_trans = NULL; +static security_context_t prev_t2r_raw = NULL; +static security_context_t prev_r2t_trans = NULL; +static security_context_t prev_r2t_raw = NULL; /* * setransd_open @@ -206,12 +207,19 @@ return ret; } +static pthread_mutex_t trans_to_raw_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t raw_to_trans_mutex = PTHREAD_MUTEX_INITIALIZER; + hidden void fini_context_translations(void) { + pthread_mutex_lock(&trans_to_raw_mutex); + pthread_mutex_lock(&raw_to_trans_mutex); free(prev_r2t_trans); free(prev_r2t_raw); free(prev_t2r_trans); free(prev_t2r_raw); + pthread_mutex_unlock(&raw_to_trans_mutex); + pthread_mutex_unlock(&trans_to_raw_mutex); } hidden int init_context_translations(void) @@ -233,6 +241,7 @@ goto out; } + pthread_mutex_lock(&trans_to_raw_mutex); if (prev_t2r_trans && strcmp(prev_t2r_trans, trans) == 0) { *rawp = strdup(prev_t2r_raw); } else { @@ -253,6 +262,7 @@ } } } + pthread_mutex_unlock(&trans_to_raw_mutex); out: return *rawp ? 0 : -1; } @@ -272,6 +282,7 @@ goto out; } + pthread_mutex_lock(&raw_to_trans_mutex); if (prev_r2t_raw && strcmp(prev_r2t_raw, raw) == 0) { *transp = strdup(prev_r2t_trans); } else { @@ -292,6 +303,7 @@ } } } + pthread_mutex_unlock(&raw_to_trans_mutex); out: return *transp ? 0 : -1; }