The parser is not correctly clearing cache files if cache-loc is specified. Fix this and unify creation and use of cacheloc so that we can hopefully avoid these bugs.
Signed-off-by: John Johansen <[email protected]> --- === modified file 'parser/parser_main.c' --- parser/parser_main.c 2013-09-23 21:56:16 +0000 +++ parser/parser_main.c 2013-09-23 22:23:20 +0000 @@ -1086,12 +1086,7 @@ */ if ((profilename && option != OPTION_REMOVE) && !force_complain && !skip_cache) { - if (cacheloc) { - if (asprintf(&cachename, "%s/%s", cacheloc, basename)<0) { - PERROR(_("Memory allocation error.")); - exit(1); - } - } else if (asprintf(&cachename, "%s/%s/%s", basedir, "cache", basename)<0) { + if (asprintf(&cachename, "%s/%s", cacheloc, basename)<0) { PERROR(_("Memory allocation error.")); exit(1); } @@ -1260,18 +1255,8 @@ static int clear_cache_files(const char *path) { - char *cache; int error; - - if (asprintf(&cache, "%s/cache", path) == -1) { - perror("asprintf"); - exit(1); - } - - error = dir_for_each(cache, clear_cache_cb); - - free(cache); - + error = dir_for_each(path, clear_cache_cb); return error; } @@ -1300,7 +1285,6 @@ { char *cache_features_path = NULL; char *cache_flags = NULL; - int rc; /* Get the match string to determine type of regex support needed */ get_match_string(); @@ -1327,12 +1311,8 @@ * - If cache/.features exists, and does not match flags_string, * force cache reading/writing off. */ - if (cacheloc) - rc = asprintf(&cache_features_path, "%s/.features", cacheloc); - else - rc = asprintf(&cache_features_path, "%s/cache/.features", basedir); - if (rc == -1) { - perror("asprintf"); + if (asprintf(&cache_features_path, "%s/.features", cacheloc) == -1) { + PERROR(_("Memory allocation error.")); exit(1); } @@ -1340,7 +1320,7 @@ if (cache_flags) { if (strcmp(flags_string, cache_flags) != 0) { if (write_cache && cond_clear_cache) { - if (clear_cache_files(basedir) || + if (clear_cache_files(cacheloc) || create_cache(cache_features_path, flags_string)) { skip_read_cache = 1; @@ -1385,8 +1365,16 @@ return retval; } + /* create the cacheloc once and use it everywhere */ + if (!cacheloc) { + if (asprintf(&cacheloc, "%s/cache", basedir) == -1) { + PERROR(_("Memory allocation error.")); + exit(1); + } + } + if (force_clear_cache) { - clear_cache_files(basedir); + clear_cache_files(cacheloc); exit(0); } -- AppArmor mailing list [email protected] Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
