aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2017-02-08 15:05:19 +1100
committerEmil Velikov <[email protected]>2017-02-13 10:20:41 +0000
commit269266359967be69f39d9aa2cddbe1faeb2eaa36 (patch)
treead48a33b387e92839cc7504aad640da9e0a45867
parente81e284611fed996b7b5d768af1d5636490c2d7f (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.c33
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)