diff options
author | Nick Mathewson <nickm@torproject.org> | 2008-10-27 16:46:45 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2008-10-27 16:46:45 +0000 |
commit | ee31e0829e976412c57521ab1cacfb57a1a76931 (patch) | |
tree | 41397a27cf5a528d8d2829b2f1008895c09183d6 /src/or/rendcommon.c | |
parent | 0ab45fee73812a90c8714a6a3d99d5727a6733f3 (diff) | |
download | tor-ee31e0829e976412c57521ab1cacfb57a1a76931.tar.gz tor-ee31e0829e976412c57521ab1cacfb57a1a76931.zip |
Verify cpath_layer match on rendezvous cells too. Fixes another case of bug 446. Based on patch from rovv.
svn:r17162
Diffstat (limited to 'src/or/rendcommon.c')
-rw-r--r-- | src/or/rendcommon.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index ccd52fceee..b5f8683f92 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -1387,16 +1387,24 @@ rend_cache_store_v2_desc_as_client(const char *desc, /** Called when we get a rendezvous-related relay cell on circuit * <b>circ</b>. Dispatch on rendezvous relay command. */ void -rend_process_relay_cell(circuit_t *circ, int command, size_t length, +rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, + int command, size_t length, const char *payload) { or_circuit_t *or_circ = NULL; origin_circuit_t *origin_circ = NULL; int r = -2; - if (CIRCUIT_IS_ORIGIN(circ)) + if (CIRCUIT_IS_ORIGIN(circ)) { origin_circ = TO_ORIGIN_CIRCUIT(circ); - else + if (layer_hint && layer_hint != origin_circ->cpath->prev) { + log_fn(LOG_PROTOCOL_WARN, LD_APP, + "Relay cell (rend purpose %d) from wrong hop on origin circ", + command); + origin_circ = NULL; + } + } else { or_circ = TO_OR_CIRCUIT(circ); + } switch (command) { case RELAY_COMMAND_ESTABLISH_INTRO: |