[apparmor] [PATCH 1/2] Use mtime instead of ctime for cache file

Seth Arnold seth.arnold at canonical.com
Thu Jun 18 18:12:44 UTC 2015


On Mon, Jun 15, 2015 at 12:10:29PM -0700, John Johansen wrote:
> 
> And the 2.9 version of this patch series. It is simpler because 2.9
> doesn't have the debug cache, and early tracking of the cache file
> that is in 2.10. It also doesn't have the ctime bug
> 
> ---
> 
> commit 14b91d4a60a942ded8c5a484ef2a737f3a2a2185
> Author: John Johansen <john.johansen at canonical.com>
> Date:   Mon Jun 15 12:05:35 2015 -0700
> 
>     Set cache file tstamp to the mtime of most recent policy file tstamp
>     
>     Currently the cache file has its mtime set at creation time, but this
>     can lead to cache issues when a policy file is updated separately from
>     the cache. This makes it possible for an update to ship a policy file
>     that is newer than the what the cache file was generated from, but
>     result in a cache hit because the cache file was local compiled after
>     the policy file was package into an update (this requires the update
>     to set the mtime of the file when locally installed to the mtime of
>     the file in its update archive but this is commonly done, especially
>     in image based updates).
>     
>     Signed-off-by: John Johansen <john.johansen at canonical.com>

Acked-by: Seth Arnold <seth.arnold at canonical.com>

Thanks

> 
> diff --git a/parser/parser_main.c b/parser/parser_main.c
> index 1d1cbe6..cd10a92 100644
> --- a/parser/parser_main.c
> +++ b/parser/parser_main.c
> @@ -38,6 +38,8 @@
>  #include <sys/types.h>
>  #include <sys/stat.h>
>  #include <sys/apparmor.h>
> +#include <sys/time.h>
> +#include <utime.h>
>  
>  #include "lib.h"
>  #include "parser.h"
> @@ -873,17 +875,18 @@ static bool valid_cached_file_version(const char *cachename)
>  	return true;
>  }
>  
> -/* returns true if time is more recent than mru_tstamp */
> -#define mru_t_cmp(a) \
> -(((a).tv_sec == (mru_tstamp).tv_sec) ? \
> -  (a).tv_nsec > (mru_tstamp).tv_nsec : (a).tv_sec > (mru_tstamp).tv_sec)
> +#define tstamp_cmp(a, b)					\
> +  (((a).tv_sec == (b).tv_sec) ?					\
> +   ((a).tv_nsec - (b).tv_nsec) :				\
> +   ((a).tv_sec - (b).tv_sec))
> +#define tstamp_is_null(a) ((a).tv_sec == 0 && (a).tv_nsec == 0)
>  
>  void update_mru_tstamp(FILE *file)
>  {
>  	struct stat stat_file;
>  	if (fstat(fileno(file), &stat_file))
>  		return;
> -	if (mru_t_cmp(stat_file.st_mtim))
> +	if (tstamp_cmp(stat_file.st_mtim, mru_tstamp) > 0)
>  		mru_tstamp = stat_file.st_mtim;
>  }
>  
> @@ -969,7 +972,8 @@ int process_profile(int option, const char *profilename)
>  		/* Load a binary cache if it exists and is newest */
>  		if (!skip_read_cache &&
>  		    stat(cachename, &stat_bin) == 0 &&
> -		    stat_bin.st_size > 0 && (mru_t_cmp(stat_bin.st_mtim)) &&
> +		    stat_bin.st_size > 0 &&
> +		    (tstamp_cmp(mru_tstamp, stat_bin.st_mtim) < 0) &&
>  		    valid_cached_file_version(cachename)) {
>  			if (show_cache)
>  				PERROR("Cache hit: %s\n", cachename);
> @@ -1037,6 +1041,12 @@ out:
>  		}
>  
>  		if (useable_cache) {
> +			struct timeval t;
> +			/* set the mtime of the cache file to the most newest
> +			 * mtime of policy files used to generate it
> +			 */
> +			TIMESPEC_TO_TIMEVAL(&t, &mru_tstamp);
> +			utimes(cachetemp, &t);
>  			if (rename(cachetemp, cachename) < 0) {
>  				pwarn("Warning failed to write cache: %s\n", cachename);
>  				unlink(cachetemp);
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20150618/737d9bff/attachment.pgp>


More information about the AppArmor mailing list