From: Peter Palfrader Date: Sun, 24 Jan 2010 19:58:30 +0000 (+0100) Subject: Handle errors reported by fwrite() in dump_microdescriptor() X-Git-Tag: tor-0.2.2.8-alpha~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=256861023e18f760bb5497630e02f139d17301b4;p=thirdparty%2Ftor.git Handle errors reported by fwrite() in dump_microdescriptor() Does not deal with error handling in dump_microdescriptor's callers. --- diff --git a/src/or/microdesc.c b/src/or/microdesc.c index c1f447c5df..45e182befb 100644 --- a/src/or/microdesc.c +++ b/src/or/microdesc.c @@ -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) {