util/disk_cache: fix bug with deleting old cache dirs
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 22 Feb 2017 03:16:04 +0000 (14:16 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 22 Feb 2017 22:20:22 +0000 (09:20 +1100)
If there was more than a single directory in the .cache/mesa dir
then it would only remove one (or none) of the directories.

Apparently Valgrind was also reporting:
Conditional jump or move depends on uninitialised value

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
src/util/disk_cache.c

index 2f138dab19b6da6a1397f29def7e5e9ae1cc02b5..f5e114513e0e9c4e6c5a57ba1fdc24609826b142 100644 (file)
@@ -152,17 +152,19 @@ remove_old_cache_directories(void *mem_ctx, char *path, const char *timestamp)
    struct dirent* d_entry;
    while((d_entry = readdir(dir)) != NULL)
    {
+      char *full_path =
+         ralloc_asprintf(mem_ctx, "%s/%s", path, d_entry->d_name);
+
       struct stat sb;
-      stat(d_entry->d_name, &sb);
-      if (S_ISDIR(sb.st_mode) &&
+      if (stat(full_path, &sb) == 0 && S_ISDIR(sb.st_mode) &&
           strcmp(d_entry->d_name, timestamp) != 0 &&
           strcmp(d_entry->d_name, "..") != 0 &&
           strcmp(d_entry->d_name, ".") != 0) {
-         char *full_path =
-            ralloc_asprintf(mem_ctx, "%s/%s", path, d_entry->d_name);
          nftw(full_path, remove_dir, 20, FTW_DEPTH);
       }
    }
+
+   closedir(dir);
 }
 
 static char *