aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-12-17 13:54:02 -0500
committerNick Mathewson <nickm@torproject.org>2013-12-17 13:54:02 -0500
commitf12d3fe9aa3d2f97eb1750e30b812358ecdd9139 (patch)
tree1ec1566f7acdcdcb039e8f569f21db8afe4269a8
parentadfcc1da4aac9766274275460fe2252bd9ffe4eb (diff)
parent561d9880f8025ddbcb2f0a586d0677908320af4f (diff)
downloadtor-f12d3fe9aa3d2f97eb1750e30b812358ecdd9139.tar
tor-f12d3fe9aa3d2f97eb1750e30b812358ecdd9139.tar.gz
Merge remote-tracking branch 'origin/maint-0.2.4'
-rw-r--r--changes/bug104234
-rw-r--r--src/or/microdesc.c33
2 files changed, 26 insertions, 11 deletions
diff --git a/changes/bug10423 b/changes/bug10423
new file mode 100644
index 000000000..493b7b15e
--- /dev/null
+++ b/changes/bug10423
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - If we fail to dump a previously cached microdescriptor to disk, avoid
+ freeing duplicate data later on. Fix for bug 10423; bugfix on
+ 0.2.4.13-alpha. Spotted by "bobnomnom".
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index 2bf6f54ab..11249910c 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -406,6 +406,26 @@ should_rebuild_md_cache(microdesc_cache_t *cache)
return 0;
}
+/**
+ * Mark <b>md</b> as having no body, and release any storage previously held
+ * by its body.
+ */
+static void
+microdesc_wipe_body(microdesc_t *md)
+{
+ if (!md)
+ return;
+
+ if (md->saved_location != SAVED_IN_CACHE)
+ tor_free(md->body);
+
+ md->off = 0;
+ md->saved_location = SAVED_NOWHERE;
+ md->body = NULL;
+ md->bodylen = 0;
+ md->no_save = 1;
+}
+
/** Regenerate the main cache file for <b>cache</b>, clear the journal file,
* and update every microdesc_t in the cache with pointers to its new
* location. If <b>force</b> is true, do this unconditionally. If
@@ -454,12 +474,7 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
size = dump_microdescriptor(fd, md, &annotation_len);
if (size < 0) {
- if (md->saved_location != SAVED_IN_CACHE)
- tor_free(md->body);
- md->saved_location = SAVED_NOWHERE;
- md->off = 0;
- md->bodylen = 0;
- md->no_save = 1;
+ microdesc_wipe_body(md);
/* rewind, in case it was a partial write. */
tor_fd_setpos(fd, off);
@@ -497,11 +512,7 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
HT_FOREACH(mdp, microdesc_map, &cache->map) {
microdesc_t *md = *mdp;
if (md->saved_location == SAVED_IN_CACHE) {
- md->off = 0;
- md->saved_location = SAVED_NOWHERE;
- md->body = NULL;
- md->bodylen = 0;
- md->no_save = 1;
+ microdesc_wipe_body(md);
}
}
return -1;