[apparmor] [PATCH v2 29/42] parser: Add aa_policy_cache function to replace all policies

Tyler Hicks tyhicks at canonical.com
Fri Mar 6 21:48:45 UTC 2015


This may be useful for something like an init daemon that simply wants
to load all cached binaries without worrying about any sort of policy
compilation.

Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
Acked-by: John Johansen <john.johansen at canonical.com>
---
 parser/policy_cache.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++
 parser/policy_cache.h |  3 +++
 2 files changed, 64 insertions(+)

diff --git a/parser/policy_cache.c b/parser/policy_cache.c
index 1b9d282..ec73cc4 100644
--- a/parser/policy_cache.c
+++ b/parser/policy_cache.c
@@ -249,6 +249,34 @@ static int init_cache_features(aa_policy_cache *policy_cache,
 	return 0;
 }
 
+struct replace_all_cb_data {
+	aa_policy_cache *policy_cache;
+	aa_kernel_interface *kernel_interface;
+};
+
+static int replace_all_cb(DIR *dir unused, const char *name, struct stat *st,
+			 void *cb_data)
+{
+	int retval = 0;
+
+	if (!S_ISDIR(st->st_mode) && !is_blacklisted(name, NULL)) {
+		struct replace_all_cb_data *data;
+		autofree char *path = NULL;
+
+		data = (struct replace_all_cb_data *) cb_data;
+		if (asprintf(&path, "%s/%s",
+			     data->policy_cache->path, name) < 0) {
+			path = NULL;
+			errno = ENOMEM;
+			return -1;
+		}
+		retval = aa_kernel_interface_replace_policy_from_file(data->kernel_interface,
+								      path);
+	}
+
+	return retval;
+}
+
 /**
  * aa_policy_cache_new - create a new policy_cache from a path
  * @policy_cache: will point to the address of an allocated and initialized
@@ -368,3 +396,36 @@ int aa_policy_cache_remove(const char *path)
 {
 	return dirat_for_each(NULL, path, NULL, clear_cache_cb);
 }
+
+/**
+ * aa_policy_cache_replace_all - performs a kernel policy replacement of all cached policies
+ * @policy_cache: the policy_cache
+ * @kernel_interface: the kernel interface to use when doing the replacement
+ *
+ * Returns: 0 on success, -1 on error with errno set and features pointing to
+ *          NULL
+ */
+int aa_policy_cache_replace_all(aa_policy_cache *policy_cache,
+				aa_kernel_interface *kernel_interface)
+{
+	struct replace_all_cb_data cb_data;
+	int retval;
+
+	if (kernel_interface) {
+		aa_kernel_interface_ref(kernel_interface);
+	} else if (aa_kernel_interface_new(&kernel_interface,
+					   policy_cache->kernel_features,
+					   NULL) == -1) {
+		kernel_interface = NULL;
+		return -1;
+	}
+
+	cb_data.policy_cache = policy_cache;
+	cb_data.kernel_interface = kernel_interface;
+	retval = dirat_for_each(NULL, policy_cache->path, &cb_data,
+				replace_all_cb);
+
+	aa_kernel_interface_unref(kernel_interface);
+
+	return retval;
+}
diff --git a/parser/policy_cache.h b/parser/policy_cache.h
index 4267d9a..6b222da 100644
--- a/parser/policy_cache.h
+++ b/parser/policy_cache.h
@@ -57,5 +57,8 @@ void aa_policy_cache_unref(aa_policy_cache *policy_cache);
 bool aa_policy_cache_is_valid(aa_policy_cache *policy_cache);
 int aa_policy_cache_create(aa_policy_cache *policy_cache);
 int aa_policy_cache_remove(const char *path);
+int aa_policy_cache_replace_all(aa_policy_cache *policy_cache,
+				aa_kernel_interface *kernel_interface);
+
 
 #endif /* __AA_POLICY_CACHE_H */
-- 
2.1.4




More information about the AppArmor mailing list