From: Daniel Wagner <daniel.wag...@bmw-carit.de> Separate the id which associates the file and the session. find_policy_by_file() and find_policy_by_lsm() contain the logic which associates the configuration file with a session. --- plugins/session_policy_local.c | 66 ++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 22 deletions(-)
diff --git a/plugins/session_policy_local.c b/plugins/session_policy_local.c index 4f8d3c9..3c59714 100644 --- a/plugins/session_policy_local.c +++ b/plugins/session_policy_local.c @@ -57,6 +57,7 @@ struct create_data { struct policy_data { int refcount; char *filename; + char *lsm_ctx; /* The Linux Security Module Context */ struct connman_session *session; struct connman_session_config *config; @@ -72,6 +73,7 @@ static void free_policy(gpointer user_data) g_slist_free(policy->config->allowed_bearers); g_free(policy->filename); + g_free(policy->lsm_ctx); g_free(policy->config); g_free(policy); } @@ -146,6 +148,40 @@ static void policy_unref(struct policy_data *policy) free_policy(policy); }; +static struct policy_data *find_policy_by_file(const char *filename) +{ + GSList *list; + struct policy_data *policy; + + for (list = policy_list; list != NULL; list = list->next) { + policy = list->data; + + if (g_strcmp0(policy->lsm_ctx, filename) != 0) + continue; + + return policy; + } + + return NULL; +} + +static struct policy_data *find_policy_by_session(const char *lsm_ctx) +{ + GSList *list; + struct policy_data *policy; + + for (list = policy_list; list != NULL; list = list->next) { + policy = list->data; + + if (g_strcmp0(policy->filename, lsm_ctx) != 0) + continue; + + return policy; + } + + return NULL; +} + static void selinux_context_reply(const unsigned char *context, void *user_data, int err) { @@ -175,12 +211,13 @@ static void selinux_context_reply(const unsigned char *context, void *user_data, goto done; } - policy = g_hash_table_lookup(file_hash, ident); - if (policy == NULL) { + policy = find_policy_by_session(ident); + if (policy == NULL) policy = create_policy(); - policy->filename = g_strdup(ident); - } else + else policy_ref(policy); + + policy->lsm_ctx = g_strdup(ident); policy->session = data->session; g_hash_table_replace(session_hash, data->session, policy); @@ -237,6 +274,8 @@ static void policy_local_destroy(struct connman_session *session) return; g_hash_table_remove(session_hash, session); + g_free(policy->lsm_ctx); + policy->lsm_ctx = NULL; policy->session = NULL; policy_unref(policy); } @@ -376,23 +415,6 @@ static void remove_policy(struct policy_data *policy) update_session(policy); } -static struct policy_data *find_policy(const char *filename) -{ - GSList *list; - struct policy_data *policy; - - for (list = policy_list; list != NULL; list = list->next) { - policy = list->data; - - if (g_strcmp0(policy->filename, filename) != 0) - continue; - - return policy; - } - - return NULL; -} - static void notify_handler(struct inotify_event *event, const char *filename) { @@ -411,7 +433,7 @@ static void notify_handler(struct inotify_event *event, /* policy != NULL can happen if the file is overwritten */ if (policy == NULL) { - policy = find_policy(filename); + policy = find_policy_by_file(filename); if (policy == NULL) policy = create_policy(); else -- 1.8.2.rc3.16.gce432ca _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman