[pkg-apparmor] Bug#883584: A reload deletes /etc/apparmor.d/cache/CACHEDIR.TAG

intrigeri intrigeri at debian.org
Wed Dec 6 10:26:34 UTC 2017


Control: tag -1 + upstream

Hi,

upstream/parser developers, there's a question for you at the bottom.

Marco d'Itri:
> "systemctl status apparmor" deletes the 
> /etc/apparmor.d/cache/CACHEDIR.TAG that I created.

Confirmed.

> Also, please ship a CACHEDIR.TAG file in the apparmor package if the 
> cache directory cannot be moved out of /etc/.

Good idea.

I've taken a look. It's easy to patch /lib/apparmor/functions to avoid
deleting that file:

-		num=`find "$cache_dir" -type f ! -name '.features' | wc -l`
+		num=`find "$cache_dir" -type f ! -name '.features' ! -name 'CACHEDIR.TAG' | wc -l`

 clear_cache_system() {
-	find "$PROFILES_CACHE" -maxdepth 1 -type f -print0 | xargs -0 rm -f --
+	find "$PROFILES_CACHE" -maxdepth 1 \
+	    -name CACHEDIR.TAG -prune -o \
+	    -type f -print0 | xargs -0 rm -f --
 }
 
 clear_cache_var() {
-	find "$PROFILES_CACHE_VAR" -maxdepth 1 -type f -print0 | xargs -0 rm -f --
+	find "$PROFILES_CACHE_VAR" -maxdepth 1 \
+	    -name CACHEDIR.TAG -prune -o \
+	    -type f -print0 | xargs -0 rm -f --
 }

… *but* that's not enough. The load_configured_profiles function runs
apparmor_parser with --write-cache, which empties the cache directory
including CACHEDIR.TAG: it calls aa_policy_cache_remove, that does

        return _aa_dirat_for_each(dirfd, path, NULL, clear_cache_cb);

… and then clear_cache_cb deletes the file it receives as argument as
long as it's a regular file.

Dear upstream/parser developers, would it feel crazy to modify
clear_cache_cb to ignore the passed file if its basename is
CACHEDIR.TAG? Or should _aa_dirat_for_each get a list of excluded file
names as a new argument, or something similar?

If any of these approaches seems acceptable, is anyone around willing
to write this patch, or should I try to find a C person elsewhere?

Thanks in advance!

Cheers,
-- 
intrigeri



More information about the pkg-apparmor-team mailing list