From 749b37bcf41917a449830e1cd1f63430b23a3346 Mon Sep 17 00:00:00 2001 From: Robert Ransom Date: Mon, 7 Nov 2011 08:48:23 -0800 Subject: [PATCH] Fix assert on clients of and authorities for v0 HS descs --- changes/bug4411 | 10 ++++++++++ src/or/rendclient.c | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 changes/bug4411 diff --git a/changes/bug4411 b/changes/bug4411 new file mode 100644 index 0000000000..1273d0264e --- /dev/null +++ b/changes/bug4411 @@ -0,0 +1,10 @@ + o Major bugfixes + + - Fix a rare assertion failure when checking whether a v0 hidden + service descriptor has any usable introduction points left, and + we don't have enough information to build a circuit to the first + intro point named in the descriptor. The HS client code in + 0.2.3.x no longer uses v0 HS descriptors, but this assertion can + trigger on (and crash) v0 HS authorities. Fixes bug 4411. + Bugfix on 0.2.3.1-alpha; diagnosed by frosty_un. + diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 1038378de1..79714f958e 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -1048,6 +1048,7 @@ rend_client_get_random_intro_impl(const rend_cache_entry_t *entry, /* Do we need to look up the router or is the extend info complete? */ if (!intro->extend_info->onion_key) { const node_t *node; + extend_info_t *new_extend_info; if (tor_digest_is_zero(intro->extend_info->identity_digest)) node = node_get_by_hex_id(intro->extend_info->nickname); else @@ -1058,8 +1059,18 @@ rend_client_get_random_intro_impl(const rend_cache_entry_t *entry, smartlist_del(usable_nodes, i); goto again; } - extend_info_free(intro->extend_info); - intro->extend_info = extend_info_from_node(node); + new_extend_info = extend_info_from_node(node); + if (!new_extend_info) { + log_info(LD_REND, "We don't have a descriptor for the intro-point relay " + "'%s'; trying another.", + extend_info_describe(intro->extend_info)); + smartlist_del(usable_nodes, i); + goto again; + } else { + extend_info_free(intro->extend_info); + intro->extend_info = new_extend_info; + } + tor_assert(intro->extend_info != NULL); } /* Check if we should refuse to talk to this router. */ if (strict &&