diff options
author | Karsten Loesing <karsten.loesing@gmx.net> | 2009-06-30 20:35:03 +0200 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-07-02 10:00:28 -0400 |
commit | 3e6bb050dd46491ac044808782a489bdf0c23f6d (patch) | |
tree | c8967bf8b83e8a4af6a0432d4e9e4bcb7d8270aa /src/or/rendclient.c | |
parent | 0cbc0c463bcd5f3a80fe9388f778d4b6e09e0815 (diff) | |
download | tor-3e6bb050dd46491ac044808782a489bdf0c23f6d.tar.gz tor-3e6bb050dd46491ac044808782a489bdf0c23f6d.zip |
Make an attempt to fix bug 1024.
The internal error "could not find intro key" occurs when we want to send
an INTRODUCE1 cell over a recently finished introduction circuit and think
we built the introduction circuit with a v2 hidden service descriptor, but
cannot find the introduction key in our descriptor.
My first guess how we can end up in this situation is that we are wrong in
thinking that we built the introduction circuit based on a v2 hidden
service descriptor. This patch checks if we have a v0 descriptor, too, and
uses that instead.
Diffstat (limited to 'src/or/rendclient.c')
-rw-r--r-- | src/or/rendclient.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 5b18a519b0..a5d7c1016e 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -94,8 +94,24 @@ rend_client_send_introduction(origin_circuit_t *introcirc, } }); if (!intro_key) { - log_warn(LD_BUG, "Internal error: could not find intro key."); - goto err; + if (rend_cache_lookup_entry(introcirc->rend_data->onion_address, + 0, &entry) > 0) { + log_warn(LD_BUG, "We have both a v0 and a v2 rend desc for this " + "service. The v2 desc doesn't contain the introduction " + "point (and key) to send an INTRODUCE1/2 cell to this " + "introduction point. Assuming the introduction point " + "is for v0 rend clients and using the service key " + "from the v0 desc instead. (This is probably a bug, " + "because we shouldn't even have both a v0 and a v2 " + "descriptor for the same service.)"); + /* See flyspray task 1024. */ + intro_key = entry->parsed->pk; + } else { + log_warn(LD_BUG, "Internal error: could not find intro key; we " + "only have a v2 rend desc with %d intro points.", + smartlist_len(entry->parsed->intro_nodes)); + goto err; + } } } if (crypto_pk_get_digest(intro_key, payload)<0) { |