@@ -124,32 +124,18 @@ static inline int selabel_is_validate_set(const struct selinux_opt *opts,
int selabel_validate(struct selabel_lookup_rec *contexts)
{
- bool validated;
- int rc;
+ int rc = 0;
- validated = __atomic_load_n(&contexts->validated, __ATOMIC_ACQUIRE);
- if (validated)
- return 0;
-
- __pthread_mutex_lock(&contexts->lock);
-
- /* Check if another thread validated the context while we waited on the mutex */
- validated = __atomic_load_n(&contexts->validated, __ATOMIC_ACQUIRE);
- if (validated) {
- __pthread_mutex_unlock(&contexts->lock);
- return 0;
- }
+ if (contexts->validated)
+ goto out;
rc = selinux_validate(&contexts->ctx_raw);
- if (rc == 0)
- __atomic_store_n(&contexts->validated, true, __ATOMIC_RELEASE);
-
- __pthread_mutex_unlock(&contexts->lock);
-
if (rc < 0)
- return -1;
+ goto out;
- return 0;
+ contexts->validated = true;
+out:
+ return rc;
}
/* Public API helpers */
@@ -157,35 +143,11 @@ static int selabel_fini(const struct selabel_handle *rec,
struct selabel_lookup_rec *lr,
bool translating)
{
- char *ctx_trans;
- int rc;
-
if (compat_validate(rec, lr, rec->spec_file, lr->lineno))
return -1;
- if (!translating)
- return 0;
-
- ctx_trans = __atomic_load_n(&lr->ctx_trans, __ATOMIC_ACQUIRE);
- if (ctx_trans)
- return 0;
-
- __pthread_mutex_lock(&lr->lock);
-
- /* Check if another thread translated the context while we waited on the mutex */
- ctx_trans = __atomic_load_n(&lr->ctx_trans, __ATOMIC_ACQUIRE);
- if (ctx_trans) {
- __pthread_mutex_unlock(&lr->lock);
- return 0;
- }
-
- rc = selinux_raw_to_trans_context(lr->ctx_raw, &ctx_trans);
- if (rc == 0)
- __atomic_store_n(&lr->ctx_trans, ctx_trans, __ATOMIC_RELEASE);
-
- __pthread_mutex_unlock(&lr->lock);
-
- if (rc)
+ if (translating && !lr->ctx_trans &&
+ selinux_raw_to_trans_context(lr->ctx_raw, &lr->ctx_trans))
return -1;
return 0;
@@ -186,7 +186,6 @@ db_close(struct selabel_handle *rec)
free(spec->key);
free(spec->lr.ctx_raw);
free(spec->lr.ctx_trans);
- __pthread_mutex_destroy(&spec->lr.lock);
}
free(catalog);
}
@@ -359,7 +358,6 @@ out_error:
free(spec->key);
free(spec->lr.ctx_raw);
free(spec->lr.ctx_trans);
- __pthread_mutex_destroy(&spec->lr.lock);
}
free(catalog);
fclose(filp);
@@ -661,7 +661,6 @@ static int insert_spec(const struct selabel_handle *rec, struct saved_data *data
.lr.ctx_trans = NULL,
.lr.lineno = lineno,
.lr.validated = false,
- .lr.lock = PTHREAD_MUTEX_INITIALIZER,
};
data->num_specs++;
@@ -795,7 +794,6 @@ static int insert_spec(const struct selabel_handle *rec, struct saved_data *data
.lr.ctx_trans = NULL,
.lr.lineno = lineno,
.lr.validated = false,
- .lr.lock = PTHREAD_MUTEX_INITIALIZER,
};
data->num_specs++;
@@ -820,7 +818,6 @@ static inline void free_spec_node(struct spec_node *node)
free(lspec->lr.ctx_raw);
free(lspec->lr.ctx_trans);
- __pthread_mutex_destroy(&lspec->lr.lock);
if (lspec->from_mmap)
continue;
@@ -835,7 +832,6 @@ static inline void free_spec_node(struct spec_node *node)
free(rspec->lr.ctx_raw);
free(rspec->lr.ctx_trans);
- __pthread_mutex_destroy(&rspec->lr.lock);
regex_data_free(rspec->regex);
__pthread_mutex_destroy(&rspec->regex_lock);
@@ -71,7 +71,6 @@ extern void digest_gen_hash(struct selabel_digest *digest);
struct selabel_lookup_rec {
char * ctx_raw;
char * ctx_trans;
- pthread_mutex_t lock; /* lock for validation and translation */
unsigned int lineno;
bool validated;
};
@@ -176,7 +176,6 @@ static void close(struct selabel_handle *rec)
free(spec->key);
free(spec->lr.ctx_raw);
free(spec->lr.ctx_trans);
- __pthread_mutex_destroy(&spec->lr.lock);
}
if (spec_arr)
@@ -203,7 +203,6 @@ static void close(struct selabel_handle *rec)
free(spec->key);
free(spec->lr.ctx_raw);
free(spec->lr.ctx_trans);
- __pthread_mutex_destroy(&spec->lr.lock);
}
if (spec_arr)
This reverts commit 20175564fcc6fdc1fee7847a2b5cb6c51353f41a. Needed to revert commit 92306daf5219e73f6e8bc9fc7699399457999bcd "libselinux: rework selabel_file(5) database", which broke Android file_context matching. Signed-off-by: James Carter <jwcart2@gmail.com> --- libselinux/src/label.c | 56 ++++++--------------------------- libselinux/src/label_db.c | 2 -- libselinux/src/label_file.h | 4 --- libselinux/src/label_internal.h | 1 - libselinux/src/label_media.c | 1 - libselinux/src/label_x.c | 1 - 6 files changed, 9 insertions(+), 56 deletions(-)