]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Handle errors reported by fwrite() in dump_microdescriptor()
authorPeter Palfrader <peter@palfrader.org>
Sun, 24 Jan 2010 19:58:30 +0000 (20:58 +0100)
committerNick Mathewson <nickm@torproject.org>
Sun, 24 Jan 2010 20:05:20 +0000 (15:05 -0500)
Does not deal with error handling in dump_microdescriptor's callers.

src/or/microdesc.c

index c1f447c5df0604b0339f0f26529eb9ff32ad341d..45e182befbe81c21708b504360aa24f3015c9e09 100644 (file)
@@ -59,7 +59,7 @@ HT_GENERATE(microdesc_map, microdesc_t, node,
 static size_t
 dump_microdescriptor(FILE *f, microdesc_t *md, size_t *annotation_len_out)
 {
-  size_t r = 0;
+  size_t r = 0, written;
   /* XXXX drops unkown annotations. */
   if (md->last_listed) {
     char buf[ISO_TIME_LEN+1];
@@ -74,7 +74,13 @@ dump_microdescriptor(FILE *f, microdesc_t *md, size_t *annotation_len_out)
   }
 
   md->off = (off_t) ftell(f);
-  fwrite(md->body, 1, md->bodylen, f);
+  written = fwrite(md->body, 1, md->bodylen, f);
+  if (written != md->bodylen) {
+    log_warn(LD_DIR, "Couldn't dump microdescriptor (wrote %lu out of %lu): %s",
+             (unsigned long)written, (unsigned long)md->bodylen,
+             strerror(ferror(f)));
+    return(-1);
+  }
   r += md->bodylen;
   return r;
 }
@@ -171,6 +177,11 @@ microdescs_add_list_to_cache(microdesc_cache_t *cache,
     if (f) {
       size_t annotation_len;
       size = dump_microdescriptor(f, md, &annotation_len);
+      if (size < 0) {
+        /* XXX handle errors from dump_microdescriptor() */
+        /* log?  return -1?  die?  coredump the universe? */
+        continue;
+      }
       md->saved_location = SAVED_IN_JOURNAL;
       cache->journal_len += size;
     } else {
@@ -292,6 +303,11 @@ microdesc_cache_rebuild(microdesc_cache_t *cache)
       continue;
 
     size = dump_microdescriptor(f, md, &annotation_len);
+    if (size < 0) {
+      /* XXX handle errors from dump_microdescriptor() */
+      /* log?  return -1?  die?  coredump the universe? */
+      continue;
+    }
     md->off = off + annotation_len;
     off += size;
     if (md->saved_location != SAVED_IN_CACHE) {