[tor-commits] [tor/release-0.3.1] Recover better from empty/invalid storagedir files

nickm at torproject.org nickm at torproject.org
Mon Dec 11 21:50:57 UTC 2017


commit c8ee12b2e8108658d647aedb92885311291b6f71
Author: Nick Mathewson <nickm at torproject.org>
Date:   Mon Nov 20 10:14:41 2017 -0500

    Recover better from empty/invalid storagedir files
    
    If we can't read a file because of an FS issue, we say "we can't
    read that" and move on.  But if we can't read it because it's empty,
    because it has no labels, or because its labels are misformatted, we
    should remove it.
    
    Fixes bug 24099; bugfix on 0.3.1.1-alpha.
---
 changes/bug24099   |  4 ++++
 src/or/conscache.c | 13 ++++++++++---
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/changes/bug24099 b/changes/bug24099
new file mode 100644
index 000000000..dca399266
--- /dev/null
+++ b/changes/bug24099
@@ -0,0 +1,4 @@
+  o Minor bugfixes (directory cache):
+    - Recover better from empty or corrupt files in the consensus cache
+      directory. Fixes bug 24099; bugfix on 0.3.1.1-alpha.
+
diff --git a/src/or/conscache.c b/src/or/conscache.c
index 9e13ce8e4..4919dba3d 100644
--- a/src/or/conscache.c
+++ b/src/or/conscache.c
@@ -539,9 +539,16 @@ consensus_cache_rescan(consensus_cache_t *cache)
     map = storage_dir_map_labeled(cache->dir, fname,
                                   &labels, &body, &bodylen);
     if (! map) {
-      /* Can't load this; continue */
-      log_warn(LD_FS, "Unable to map file %s from consensus cache: %s",
-               escaped(fname), strerror(errno));
+      if (errno == ERANGE || errno == EINVAL) {
+        log_warn(LD_FS, "Found %s file %s in consensus cache; removing it.",
+                 errno == ERANGE ? "empty" : "misformatted",
+                 escaped(fname));
+        storage_dir_remove_file(cache->dir, fname);
+      } else {
+        /* Can't load this; continue */
+        log_warn(LD_FS, "Unable to map file %s from consensus cache: %s",
+                 escaped(fname), strerror(errno));
+      }
       continue;
     }
     consensus_cache_entry_t *ent =





More information about the tor-commits mailing list