aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-05-24 11:07:01 -0400
committerNick Mathewson <nickm@torproject.org>2012-05-24 11:07:01 -0400
commit0da40bba8858337c27b4ca0e40e0d9be00df9131 (patch)
treeff2e09b4c5021a3a18ed019c76c2eb46e4faf6fd
parent466276faa50c4cb31857dfea2ae9e1612aae3911 (diff)
downloadtor-0da40bba8858337c27b4ca0e40e0d9be00df9131.tar
tor-0da40bba8858337c27b4ca0e40e0d9be00df9131.tar.gz
Abort writing cached-microdescs if a failed write has occurred.
Bug 2954; fix on 0.2.2.6-alpha.
-rw-r--r--changes/bug2954_more4
-rw-r--r--src/or/microdesc.c14
2 files changed, 14 insertions, 4 deletions
diff --git a/changes/bug2954_more b/changes/bug2954_more
new file mode 100644
index 000000000..68fdf138e
--- /dev/null
+++ b/changes/bug2954_more
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - If we fail to write a microdescriptor to disk, do not continue
+ replacing the old microdescriptor file. Fix for bug 2954; bugfix
+ on 0.2.2.6-alpha.
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index be9b99759..59b7d7b48 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -80,7 +80,12 @@ dump_microdescriptor(FILE *f, microdesc_t *md, size_t *annotation_len_out)
char annotation[ISO_TIME_LEN+32];
format_iso_time(buf, md->last_listed);
tor_snprintf(annotation, sizeof(annotation), "@last-listed %s\n", buf);
- fputs(annotation, f);
+ if (fputs(annotation, f) < 0) {
+ log_warn(LD_DIR,
+ "Couldn't write microdescriptor annotation: %s",
+ strerror(ferror(f)));
+ return -1;
+ }
r += strlen(annotation);
*annotation_len_out = r;
} else {
@@ -226,9 +231,10 @@ microdescs_add_list_to_cache(microdesc_cache_t *cache,
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;
+ /* we already warned in dump_microdescriptor; */
+ abort_writing_to_file(open_file);
+ smartlist_clear(added);
+ return added;
}
md->saved_location = SAVED_IN_JOURNAL;
cache->journal_len += size;