[apparmor] [PATCH 23/31] parser: Create aa_features function to write features to a file

John Johansen john.johansen at canonical.com
Tue Jan 20 14:36:16 UTC 2015


On 12/05/2014 04:22 PM, Tyler Hicks wrote:
> This patch removes the final dependency on callers needing access to the
> features string so aa_features_get_string() can go away.
> 
> Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
Acked-by: John Johansen <john.johansen at canonical.com>

> ---
>  parser/features.c     | 30 ++++++++++++++++++++++++++----
>  parser/features.h     |  2 +-
>  parser/policy_cache.c | 18 ++++++------------
>  3 files changed, 33 insertions(+), 17 deletions(-)
> 
> diff --git a/parser/features.c b/parser/features.c
> index 3dbbd21..7b79b85 100644
> --- a/parser/features.c
> +++ b/parser/features.c
> @@ -299,14 +299,36 @@ void aa_features_unref(aa_features *features)
>  }
>  
>  /**
> - * aa_features_get_string - provides immutable string representation of features
> + * aa_features_write_to_file - write a string representation to a file
>   * @features: the features
> + * @path: the path to write to
>   *
> - * Returns: an immutable string representation of features
> + * Returns: 0 on success, -1 on error with errno set
>   */
> -const char *aa_features_get_string(aa_features *features)
> +int aa_features_write_to_file(aa_features *features, const char *path)
>  {
> -	return features->string;
> +	autoclose int fd = -1;
> +	size_t size;
> +	ssize_t retval;
> +	char *string;
> +
> +	fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC | O_CLOEXEC,
> +		  S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
> +	if (fd == -1)
> +		return -1;
> +
> +	string = features->string;
> +	size = strlen(string);
> +	do {
> +		retval = write(fd, string, size);
> +		if (retval == -1)
> +			return -1;
> +
> +		size -= retval;
> +		string += retval;
> +	} while (size);
> +
> +	return 0;
>  }
>  
>  /**
> diff --git a/parser/features.h b/parser/features.h
> index 61adb12..fd71f3f 100644
> --- a/parser/features.h
> +++ b/parser/features.h
> @@ -27,7 +27,7 @@ int aa_features_new_from_string(aa_features **features,
>  int aa_features_new_from_kernel(aa_features **features);
>  aa_features *aa_features_ref(aa_features *features);
>  void aa_features_unref(aa_features *features);
> -const char *aa_features_get_string(aa_features *features);
> +int aa_features_write_to_file(aa_features *features, const char *path);
>  bool aa_features_is_equal(aa_features *features1, aa_features *features2);
>  
>  unsigned int aa_features_supports_max_abi(aa_features *features);
> diff --git a/parser/policy_cache.c b/parser/policy_cache.c
> index 27c83c1..dea7e21 100644
> --- a/parser/policy_cache.c
> +++ b/parser/policy_cache.c
> @@ -107,7 +107,7 @@ int clear_cache_files(const char *path)
>  	return dirat_for_each(NULL, path, NULL, clear_cache_cb);
>  }
>  
> -int create_cache(const char *cachedir, const char *path, const char *features)
> +int create_cache(const char *cachedir, const char *path, aa_features *features)
>  {
>  	struct stat stat_file;
>  	autofclose FILE * f = NULL;
> @@ -116,13 +116,10 @@ int create_cache(const char *cachedir, const char *path, const char *features)
>  		goto error;
>  
>  create_file:
> -	f = fopen(path, "w");
> -	if (f) {
> -		if (fwrite(features, strlen(features), 1, f) != 1 )
> -			goto error;
> +	if (aa_features_write_to_file(features, path) == -1)
> +		goto error;
>  
> -		return 0;
> -	}
> +	return 0;
>  
>  error:
>  	/* does the dir exist? */
> @@ -231,7 +228,6 @@ int setup_cache(aa_features *kernel_features, const char *cacheloc)
>  {
>  	autofree char *cache_features_path = NULL;
>  	aa_features *cache_features;
> -	const char *kernel_features_string;
>  
>  	if (!cacheloc) {
>  		errno = EINVAL;
> @@ -250,12 +246,11 @@ int setup_cache(aa_features *kernel_features, const char *cacheloc)
>  		return -1;
>  	}
>  
> -	kernel_features_string = aa_features_get_string(kernel_features);
>  	if (!aa_features_new(&cache_features, cache_features_path)) {
>  		if (!aa_features_is_equal(kernel_features, cache_features)) {
>  			if (write_cache && cond_clear_cache) {
>  				if (create_cache(cacheloc, cache_features_path,
> -						 kernel_features_string))
> +						 kernel_features))
>  					skip_read_cache = 1;
>  			} else {
>  				if (show_cache)
> @@ -266,8 +261,7 @@ int setup_cache(aa_features *kernel_features, const char *cacheloc)
>  		}
>  		aa_features_unref(cache_features);
>  	} else if (write_cache) {
> -		create_cache(cacheloc, cache_features_path,
> -			     kernel_features_string);
> +		create_cache(cacheloc, cache_features_path, kernel_features);
>  	}
>  
>  	return 0;
> 




More information about the AppArmor mailing list