diff options
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/or.h | 4 | ||||
-rw-r--r-- | src/or/relay.c | 3 | ||||
-rw-r--r-- | src/or/rendcommon.c | 14 |
3 files changed, 15 insertions, 6 deletions
diff --git a/src/or/or.h b/src/or/or.h index a0a6a5e376..0e7ce9a300 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -3688,8 +3688,8 @@ typedef struct rend_service_descriptor_t { int rend_cmp_service_ids(const char *one, const char *two); -void rend_process_relay_cell(circuit_t *circ, int command, size_t length, - const char *payload); +void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, + int command, size_t length, const char *payload); void rend_service_descriptor_free(rend_service_descriptor_t *desc); int rend_encode_service_descriptor(rend_service_descriptor_t *desc, diff --git a/src/or/relay.c b/src/or/relay.c index 92d5db794c..5ada6d319c 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1253,7 +1253,8 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, case RELAY_COMMAND_RENDEZVOUS2: case RELAY_COMMAND_INTRO_ESTABLISHED: case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED: - rend_process_relay_cell(circ, rh.command, rh.length, + rend_process_relay_cell(circ, layer_hint, + rh.command, rh.length, cell->payload+RELAY_HEADER_SIZE); return 0; } diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index 559d67e94d..dfa718c0a5 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -1180,16 +1180,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: |