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 a46f1b3..55264ed 100644
--- a/plugins/session_policy_local.c
+++ b/plugins/session_policy_local.c
@@ -59,6 +59,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);
 }
@@ -144,6 +146,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)
 {
@@ -167,12 +203,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);
@@ -227,6 +264,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);
 }
@@ -367,23 +406,6 @@ static void remove_policy(struct policy_data *policy)
        update_session(policy->session);
 }
 
-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)
 {
@@ -402,7 +424,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.1.3.566.gaa39828

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to