On 12/05/2014 04:22 PM, Tyler Hicks wrote: > 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 <[email protected]>
Acked-by: John Johansen <[email protected]> > --- > 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 d6abbdd..2aff6f6 100644 > --- a/parser/policy_cache.c > +++ b/parser/policy_cache.c > @@ -250,6 +250,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 > @@ -369,3 +397,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 */ > -- AppArmor mailing list [email protected] Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
