commit e602c4031b57f0780661ce0473a5e30d187d385c Author: Nick Mathewson nickm@torproject.org Date: Wed Jun 12 12:12:11 2013 -0400
Make all consumers of microdesc_t.body tolerate NULL
This is another fix to try to mitigate recurrences of 8031/8822. --- src/or/control.c | 6 ++---- src/or/dirserv.c | 2 +- src/or/microdesc.c | 6 +++++- 3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/or/control.c b/src/or/control.c index 4878268..5ae7b71 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -1711,8 +1711,7 @@ getinfo_helper_dir(control_connection_t *control_conn, const node_t *node = node_get_by_hex_id(question+strlen("md/id/")); const microdesc_t *md = NULL; if (node) md = node->md; - if (md) { - tor_assert(md->body); + if (md && md->body) { *answer = tor_strndup(md->body, md->bodylen); } } else if (!strcmpstart(question, "md/name/")) { @@ -1722,8 +1721,7 @@ getinfo_helper_dir(control_connection_t *control_conn, /* XXXX duplicated code */ const microdesc_t *md = NULL; if (node) md = node->md; - if (md) { - tor_assert(md->body); + if (md && md->body) { *answer = tor_strndup(md->body, md->bodylen); } } else if (!strcmpstart(question, "desc-annotations/id/")) { diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 8f6d9ec..3e46153 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -3981,7 +3981,7 @@ connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn) char *fp256 = smartlist_pop_last(conn->fingerprint_stack); microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256); tor_free(fp256); - if (!md) + if (!md || !md->body) continue; if (conn->zlib_state) { /* XXXX024 This 'last' business should actually happen on the last diff --git a/src/or/microdesc.c b/src/or/microdesc.c index f99e1c8..05e3b41 100644 --- a/src/or/microdesc.c +++ b/src/or/microdesc.c @@ -75,6 +75,10 @@ dump_microdescriptor(int fd, microdesc_t *md, size_t *annotation_len_out) { ssize_t r = 0; size_t written; + if (md->body == NULL) { + *annotation_len_out = 0; + return 0; + } /* XXXX drops unknown annotations. */ if (md->last_listed) { char buf[ISO_TIME_LEN+1]; @@ -447,7 +451,7 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force) HT_FOREACH(mdp, microdesc_map, &cache->map) { microdesc_t *md = *mdp; size_t annotation_len; - if (md->no_save) + if (md->no_save || !md->body) continue;
size = dump_microdescriptor(fd, md, &annotation_len);