mirror of
https://gitlab.com/apparmor/apparmor.git
synced 2025-03-04 08:24:42 +01:00
Subject: [patch] fix apparmor cache tempfile location to use passed arg v2
Merge from trunk revision 2142 This patch fixes problems in the handling of both the final cache name location and the temporary cache file when an alternate location is specified. The first issue is that if the alternate cache directory location was specified, the alternate directory name would be used as the final location for the cache file, rather than the alternate directory + the basename of the profile. The second issue is that it would generate the temporary file that it stores the cache file in [basedir]/cache even if an alternate cache location was specified on the command line. This causes a problem if [basedir]/cache is on a separate device than the alternate cache location, because the rename() of the tempfile into the final location would fail (which the parser would not check the return code of). This patch fixes the above by incorporating the basename into the cache file name if the alternate cache location has been specified, bases the temporary cache file name on the destination cache name (such that they end up in the same directory), and finally detects if the rename fails and unlinks the temporary file if that happens (rather than leave it around). It also has been updated to add a couple of testcases to verify that writing and reading from an alternate cache location work. Patch history: v1: first draft of patch v2: add testcases, convert PERROR() to pwarn() if rename() fails for placing cachefile into place. For 2.8 branch: Signed-off-by: Steve Beattie <sbeattie@ubuntu.com> Acked-by: Seth Arnold <seth.arnold@canonical.com>
This commit is contained in:
parent
09c2da3a69
commit
2fec3758ed
2 changed files with 19 additions and 6 deletions
|
@ -1087,8 +1087,7 @@ int process_profile(int option, char *profilename)
|
||||||
if ((profilename && option != OPTION_REMOVE) && !force_complain &&
|
if ((profilename && option != OPTION_REMOVE) && !force_complain &&
|
||||||
!skip_cache) {
|
!skip_cache) {
|
||||||
if (cacheloc) {
|
if (cacheloc) {
|
||||||
cachename = strdup(cacheloc);
|
if (asprintf(&cachename, "%s/%s", cacheloc, basename)<0) {
|
||||||
if (!cachename) {
|
|
||||||
PERROR(_("Memory allocation error."));
|
PERROR(_("Memory allocation error."));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -1107,7 +1106,7 @@ int process_profile(int option, char *profilename)
|
||||||
}
|
}
|
||||||
if (write_cache) {
|
if (write_cache) {
|
||||||
/* Otherwise, set up to save a cached copy */
|
/* Otherwise, set up to save a cached copy */
|
||||||
if (asprintf(&cachetemp, "%s/%s/%s-XXXXXX", basedir, "cache", basename)<0) {
|
if (asprintf(&cachetemp, "%s-XXXXXX", cachename)<0) {
|
||||||
perror("asprintf");
|
perror("asprintf");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -1165,8 +1164,11 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useable_cache) {
|
if (useable_cache) {
|
||||||
rename(cachetemp, cachename);
|
if (rename(cachetemp, cachename) < 0) {
|
||||||
if (show_cache)
|
pwarn("Warning failed to write cache: %s\n", cachename);
|
||||||
|
unlink(cachetemp);
|
||||||
|
}
|
||||||
|
else if (show_cache)
|
||||||
PERROR("Wrote cache: %s\n", cachename);
|
PERROR("Wrote cache: %s\n", cachename);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -12,7 +12,8 @@ fi
|
||||||
|
|
||||||
# fake base directory
|
# fake base directory
|
||||||
basedir=$(mktemp -d -t aa-cache-XXXXXX)
|
basedir=$(mktemp -d -t aa-cache-XXXXXX)
|
||||||
trap "rm -rf $basedir" EXIT
|
altcachedir=$(mktemp -d -t aa-alt-cache-XXXXXXXX)
|
||||||
|
trap "rm -rf $basedir $altcachedir" EXIT
|
||||||
mkdir -p $basedir/cache
|
mkdir -p $basedir/cache
|
||||||
|
|
||||||
ARGS="--base $basedir --skip-kernel-load"
|
ARGS="--base $basedir --skip-kernel-load"
|
||||||
|
@ -158,3 +159,13 @@ echo "ok"
|
||||||
echo -n "Cache reading is skipped when parser in \$PATH is newer: "
|
echo -n "Cache reading is skipped when parser in \$PATH is newer: "
|
||||||
(PATH=$basedir/parser/ /bin/sh -c "apparmor_parser $ARGS -v -r $basedir/$profile") | grep -q 'Replacement succeeded for' || { echo "FAIL"; exit 1; }
|
(PATH=$basedir/parser/ /bin/sh -c "apparmor_parser $ARGS -v -r $basedir/$profile") | grep -q 'Replacement succeeded for' || { echo "FAIL"; exit 1; }
|
||||||
echo "ok"
|
echo "ok"
|
||||||
|
|
||||||
|
echo -n "Profiles are cached in alternate location when requested: "
|
||||||
|
../apparmor_parser $ARGS -q --write-cache --cache-loc $altcachedir -r $basedir/$profile
|
||||||
|
[ ! -f $altcachedir/$profile ] && echo "FAIL ($altcachedir/$profile does not exist)" && exit 1
|
||||||
|
echo "ok"
|
||||||
|
|
||||||
|
echo -n "Cache is loaded from alt location when it exists and features match: "
|
||||||
|
../apparmor_parser $ARGS -v -r $basedir/$profile --cache-loc $altcachedir | grep -q 'Cached reload succeeded' || { echo "FAIL"; exit 1; }
|
||||||
|
echo "ok"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue