diff options
author | Aaron Merey <amerey@redhat.com> | 2020-02-11 15:54:55 -0500 |
---|---|---|
committer | Frank Ch. Eigler <fche@redhat.com> | 2020-02-19 14:01:33 -0500 |
commit | 889edd912ccbe4f0725319acec52edda29ec1584 (patch) | |
tree | 7cb98daf400b701baff7b0dc59e4155848510a31 | |
parent | c4600ae002c8a8738035ec5f80e818171811c9d4 (diff) | |
download | elfutils-889edd912ccbe4f0725319acec52edda29ec1584.tar.gz |
PR25365: debuginfod-client: restrict cleanup to client-pattern files
Avoid deleting general files and directories in case a user
mis-sets $DEBUGINFOD_CACHE_PATH or accidentally moves a file
into the cache.
Signed-off-by: Aaron Merey <amerey@redhat.com>
-rw-r--r-- | debuginfod/ChangeLog | 5 | ||||
-rw-r--r-- | debuginfod/debuginfod-client.c | 13 | ||||
-rw-r--r-- | tests/ChangeLog | 5 | ||||
-rwxr-xr-x | tests/run-debuginfod-find.sh | 12 |
4 files changed, 34 insertions, 1 deletions
diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index d812e6d7..b297a374 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,8 @@ +2020-02-19 Aaron Merey <amerey@redhat.com> + + * debuginfod-client.c (debuginfod_clean_cache): Restrict + cleanup to client-pattern files. + 2020-02-05 Frank Ch. Eigler <fche@redhat.com> * debuginfod.cxx (argp options): Add -Z option. diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index e5a2e824..186aa90a 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -50,6 +50,7 @@ #include <errno.h> #include <fcntl.h> #include <fts.h> +#include <regex.h> #include <string.h> #include <stdbool.h> #include <linux/limits.h> @@ -241,10 +242,19 @@ debuginfod_clean_cache(debuginfod_client *c, if (fts == NULL) return -errno; + regex_t re; + const char * pattern = ".*/[a-f0-9]+/(debuginfo|executable|source.*)$"; + if (regcomp (&re, pattern, REG_EXTENDED | REG_NOSUB) != 0) + return -ENOMEM; + FTSENT *f; long files = 0; while ((f = fts_read(fts)) != NULL) { + /* ignore any files that do not match the pattern. */ + if (regexec (&re, f->fts_path, 0, NULL, 0) != 0) + continue; + files++; if (c->progressfn) /* inform/check progress callback */ if ((c->progressfn) (c, files, 0)) @@ -268,7 +278,8 @@ debuginfod_clean_cache(debuginfod_client *c, ; } } - fts_close(fts); + fts_close (fts); + regfree (&re); /* Update timestamp representing when the cache was last cleaned. */ utime (interval_path, NULL); diff --git a/tests/ChangeLog b/tests/ChangeLog index 1f55a291..01e4a083 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2020-02-19 Aaron Merey <amerey@redhat.com> + + * run-debuginfod-find.sh: Test that files unrelated to debuginfod + survive cache cleaning. + 2020-02-08 Mark Wielaard <mark@klomp.org> * run-pt_gnu_prop-tests.sh: New test. diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh index 1cc8f406..2964e7c0 100755 --- a/tests/run-debuginfod-find.sh +++ b/tests/run-debuginfod-find.sh @@ -365,6 +365,12 @@ testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1 ######################################################################## +# Add some files to the cache that do not fit its naming format. +# They should survive cache cleaning. +mkdir $DEBUGINFOD_CACHE_PATH/malformed +touch $DEBUGINFOD_CACHE_PATH/malformed0 +touch $DEBUGINFOD_CACHE_PATH/malformed/malformed1 + # Trigger a cache clean and run the tests again. The clients should be unable to # find the target. echo 0 > $DEBUGINFOD_CACHE_PATH/cache_clean_interval_s @@ -374,6 +380,12 @@ testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1 testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID2 && false || true +if [ ! -f $DEBUGINFOD_CACHE_PATH/malformed0 ] \ + || [ ! -f $DEBUGINFOD_CACHE_PATH/malformed/malformed1 ]; then + echo "unrelated files did not survive cache cleaning" + exit 1 +fi + # Test debuginfod without a path list; reuse $PORT1 env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -U -d :memory: -p $PORT1 -L -F & PID3=$! |