Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/include/dump_dir.h | 2 ++
src/lib/copy_file_recursive.c | 5 +++++
src/lib/dirsize.c | 12 ++++++++++++
src/lib/dump_dir.c | 32 ++++++++++++++++++++++++++++++++
4 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/src/include/dump_dir.h b/src/include/dump_dir.h
index 6d77a49..e2a4ea8 100644
--- a/src/include/dump_dir.h
+++ b/src/include/dump_dir.h
@@ -92,6 +92,8 @@ report_result_t *find_in_reported_to(struct dump_dir *dd, const char
*prefix);
void delete_dump_dir(const char *dirname);
+int is_abrt_dump_dir(const char *path);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/lib/copy_file_recursive.c b/src/lib/copy_file_recursive.c
index 6bad978..54655fd 100644
--- a/src/lib/copy_file_recursive.c
+++ b/src/lib/copy_file_recursive.c
@@ -85,6 +85,11 @@ int copy_file_recursive(const char *source, const char *dest)
if (dot_or_dotdot(d->d_name))
continue;
new_source = concat_path_file(source, d->d_name);
+ if (!is_abrt_dump_dir(new_source))
+ {
+ free(new_source);
+ continue;
+ }
new_dest = concat_path_file(dest, d->d_name);
if (copy_file_recursive(new_source, new_dest) < 0)
retval = -1;
diff --git a/src/lib/dirsize.c b/src/lib/dirsize.c
index 77dc443..67874c5 100644
--- a/src/lib/dirsize.c
+++ b/src/lib/dirsize.c
@@ -32,6 +32,12 @@ double get_dirsize(const char *pPath)
if (dot_or_dotdot(ep->d_name))
continue;
char *dname = concat_path_file(pPath, ep->d_name);
+ if (!is_abrt_dump_dir(dname))
+ {
+ free(dname);
+ continue;
+ }
+
if (lstat(dname, &statbuf) != 0)
{
free(dname);
@@ -72,6 +78,12 @@ double get_dirsize_find_largest_dir(
if (dot_or_dotdot(ep->d_name))
continue;
char *dname = concat_path_file(pPath, ep->d_name);
+ if (!is_abrt_dump_dir(dname))
+ {
+ free(dname);
+ continue;
+ }
+
if (lstat(dname, &statbuf) != 0)
{
free(dname);
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
index 1f03043..c228fa1 100644
--- a/src/lib/dump_dir.c
+++ b/src/lib/dump_dir.c
@@ -539,6 +539,11 @@ void dd_sanitize_mode_and_owner(struct dump_dir *dd)
if (dent->d_name[0] == '.') /* ".lock", ".",
".."? skip */
continue;
char *full_path = concat_path_file(dd->dd_dirname, dent->d_name);
+ if (!is_abrt_dump_dir(full_path))
+ {
+ free(full_path);
+ continue;
+ }
struct stat statbuf;
if (lstat(full_path, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
{
@@ -587,6 +592,11 @@ static int delete_file_dir(const char *dir, bool skip_lock_file)
continue;
}
char *full_path = concat_path_file(dir, dent->d_name);
+ if (!is_abrt_dump_dir(full_path))
+ {
+ free(full_path);
+ continue;
+ }
if (unlink(full_path) == -1 && errno != ENOENT)
{
int err = 0;
@@ -927,3 +937,25 @@ void delete_dump_dir(const char *dirname)
dd_delete(dd);
}
}
+
+int is_abrt_dump_dir(const char *path)
+{
+ char *analyzer_path = concat_path_file(path, FILENAME_ANALYZER);
+ int fd = open(analyzer_path, O_RDONLY);
+ if (fd < 0)
+ {
+ VERB3 perror_msg("Can't open '%s'", analyzer_path);
+ return 0;
+ }
+
+ struct stat st;
+ if (fstat(fd, &st) != 0 || !S_ISREG(st.st_mode))
+ {
+ VERB3 error_msg("'%s': not a regular file", analyzer_path);
+ close(fd);
+ return 0;
+ }
+
+ free(analyzer_path);
+ return -1;
+}
--
1.7.6.345.g5c2f8