From: Daniel Wagner <[email protected]>
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 bf965d2..de9c1ab 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(int error,
const unsigned char *context, void *user_data)
{
@@ -175,12 +211,13 @@ static void selinux_context_reply(int error,
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
[email protected]
http://lists.connman.net/listinfo/connman