|
@@ -445,7 +445,7 @@ rend_process_relay_cell(circuit_t *circ, int command, size_t length,
|
|
|
{
|
|
|
or_circuit_t *or_circ = NULL;
|
|
|
origin_circuit_t *origin_circ = NULL;
|
|
|
- int r;
|
|
|
+ int r = -2;
|
|
|
if (CIRCUIT_IS_ORIGIN(circ))
|
|
|
origin_circ = TO_ORIGIN_CIRCUIT(circ);
|
|
|
else
|
|
@@ -453,37 +453,48 @@ rend_process_relay_cell(circuit_t *circ, int command, size_t length,
|
|
|
|
|
|
switch (command) {
|
|
|
case RELAY_COMMAND_ESTABLISH_INTRO:
|
|
|
- r = rend_mid_establish_intro(or_circ,payload,length);
|
|
|
+ if (or_circ)
|
|
|
+ r = rend_mid_establish_intro(or_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_ESTABLISH_RENDEZVOUS:
|
|
|
- r = rend_mid_establish_rendezvous(or_circ,payload,length);
|
|
|
+ if (or_circ)
|
|
|
+ r = rend_mid_establish_rendezvous(or_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_INTRODUCE1:
|
|
|
- r = rend_mid_introduce(or_circ,payload,length);
|
|
|
+ if (or_circ)
|
|
|
+ r = rend_mid_introduce(or_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_INTRODUCE2:
|
|
|
- r = rend_service_introduce(origin_circ,payload,length);
|
|
|
+ if (origin_circ)
|
|
|
+ r = rend_service_introduce(origin_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_INTRODUCE_ACK:
|
|
|
- r = rend_client_introduction_acked(origin_circ,payload,length);
|
|
|
+ if (origin_circ)
|
|
|
+ r = rend_client_introduction_acked(origin_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_RENDEZVOUS1:
|
|
|
- r = rend_mid_rendezvous(or_circ,payload,length);
|
|
|
+ if (or_circ)
|
|
|
+ r = rend_mid_rendezvous(or_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_RENDEZVOUS2:
|
|
|
- r = rend_client_receive_rendezvous(origin_circ,payload,length);
|
|
|
+ if (origin_circ)
|
|
|
+ r = rend_client_receive_rendezvous(origin_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_INTRO_ESTABLISHED:
|
|
|
- r = rend_service_intro_established(origin_circ,payload,length);
|
|
|
+ if (origin_circ)
|
|
|
+ r = rend_service_intro_established(origin_circ,payload,length);
|
|
|
break;
|
|
|
case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED:
|
|
|
- r = rend_client_rendezvous_acked(origin_circ,payload,length);
|
|
|
+ if (origin_circ)
|
|
|
+ r = rend_client_rendezvous_acked(origin_circ,payload,length);
|
|
|
break;
|
|
|
default:
|
|
|
- tor_assert(0);
|
|
|
+ tor_fragile_assert();
|
|
|
}
|
|
|
|
|
|
- (void)r;
|
|
|
+ if (r == -2)
|
|
|
+ log_info(LD_PROTOCOL, "Dropping cell (type %d) for wrong circuit type.",
|
|
|
+ command);
|
|
|
}
|
|
|
|
|
|
/** Return the number of entries in our rendezvous descriptor cache. */
|