summaryrefslogtreecommitdiff
path: root/src/or/rendcommon.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2008-10-27 16:46:45 +0000
committerNick Mathewson <nickm@torproject.org>2008-10-27 16:46:45 +0000
commitee31e0829e976412c57521ab1cacfb57a1a76931 (patch)
tree41397a27cf5a528d8d2829b2f1008895c09183d6 /src/or/rendcommon.c
parent0ab45fee73812a90c8714a6a3d99d5727a6733f3 (diff)
downloadtor-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.c14
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: