[tor-commits] [tor/master] Make all consumers of microdesc_t.body tolerate NULL

nickm at torproject.org nickm at torproject.org
Thu Jun 13 13:43:58 UTC 2013


commit e602c4031b57f0780661ce0473a5e30d187d385c
Author: Nick Mathewson <nickm at 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);





More information about the tor-commits mailing list