diff options
author | Timothy Arceri <[email protected]> | 2017-02-08 15:05:19 +1100 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2017-02-13 10:20:41 +0000 |
commit | 269266359967be69f39d9aa2cddbe1faeb2eaa36 (patch) | |
tree | ad48a33b387e92839cc7504aad640da9e0a45867 | |
parent | e81e284611fed996b7b5d768af1d5636490c2d7f (diff) |
util/disk_cache: use stat() to check if entry is a directory
d_type is not supported on all systems.
Tested-by: Vinson Lee <[email protected]>
Reviewed-by: Emil Velikov <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97967
(cherry picked from commit d7b3707c612027b354deea6bc5eae56a02d5f8d5)
Squashed with commit:
util/disk_cache: correctly use stat(3)
I forgot to error check stat() and also I wasn't using the subdir in
is_two_character_sub_directory().
Fixes: d7b3707c612 "util/disk_cache: use stat() to check if entry is a directory"
Reviewed-by: Plamena Manolova <[email protected]>
Reviewed-by: Emil Velikov <[email protected]>
(cherry picked from commit 0cbde643eb29c8bf19eb8551ac8e821f7f733212)
-rw-r--r-- | src/util/disk_cache.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 6de608c2e4a..d3e8b401232 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -366,7 +366,8 @@ make_cache_file_directory(struct disk_cache *cache, cache_key key) */ static char * choose_random_file_matching(const char *dir_path, - bool (*predicate)(struct dirent *)) + bool (*predicate)(struct dirent *, + const char *dir_path)) { DIR *dir; struct dirent *entry; @@ -383,7 +384,7 @@ choose_random_file_matching(const char *dir_path, entry = readdir(dir); if (entry == NULL) break; - if (! predicate(entry)) + if (!predicate(entry, dir_path)) continue; count++; @@ -403,7 +404,7 @@ choose_random_file_matching(const char *dir_path, entry = readdir(dir); if (entry == NULL) break; - if (! predicate(entry)) + if (!predicate(entry, dir_path)) continue; if (count == victim) break; @@ -428,14 +429,20 @@ choose_random_file_matching(const char *dir_path, * ".tmp" */ static bool -is_regular_non_tmp_file(struct dirent *entry) +is_regular_non_tmp_file(struct dirent *entry, const char *path) { - size_t len; + char *filename; + if (asprintf(&filename, "%s/%s", path, entry->d_name) == -1) + return false; + + struct stat sb; + int res = stat(filename, &sb); + free(filename); - if (entry->d_type != DT_REG) + if (res == -1 || !S_ISREG(sb.st_mode)) return false; - len = strlen (entry->d_name); + size_t len = strlen (entry->d_name); if (len >= 4 && strcmp(&entry->d_name[len-4], ".tmp") == 0) return false; @@ -469,9 +476,17 @@ unlink_random_file_from_directory(const char *path) * special name of "..") */ static bool -is_two_character_sub_directory(struct dirent *entry) +is_two_character_sub_directory(struct dirent *entry, const char *path) { - if (entry->d_type != DT_DIR) + char *subdir; + if (asprintf(&subdir, "%s/%s", path, entry->d_name) == -1) + return false; + + struct stat sb; + int res = stat(subdir, &sb); + free(subdir); + + if (res == -1 || !S_ISDIR(sb.st_mode)) return false; if (strlen(entry->d_name) != 2) |