diff options
author | Nick Mathewson <nickm@torproject.org> | 2013-12-17 13:53:11 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2013-12-17 13:53:11 -0500 |
commit | 561d9880f8025ddbcb2f0a586d0677908320af4f (patch) | |
tree | 39a59491bd5aa6887e59f573bb1ecdc07e385581 | |
parent | 3d5154550c92766347631e4d15fae825a0f165dd (diff) | |
parent | 46b3b6208de3e5a5b87b4a33387d18343bc3c851 (diff) | |
download | tor-561d9880f8025ddbcb2f0a586d0677908320af4f.tar.gz tor-561d9880f8025ddbcb2f0a586d0677908320af4f.zip |
Merge branch 'bug10423' into maint-0.2.4
-rw-r--r-- | changes/bug10423 | 4 | ||||
-rw-r--r-- | src/or/microdesc.c | 33 |
2 files changed, 26 insertions, 11 deletions
diff --git a/changes/bug10423 b/changes/bug10423 new file mode 100644 index 0000000000..493b7b15e3 --- /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 c4907faf6f..90ac0ac649 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); @@ -496,11 +511,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; |