r9272@Kushana: nickm | 2006-10-19 12:52:37 -0400

Fix an XXX in handling destroy cells: when we get a destroy cell with reason FOO, do not tell the controller REASON=FOO.  Instead, say REASON=DESTROYED REMOTE_REASON=FOO. Suggested by a conversation with Mike Perry.


svn:r8760
This commit is contained in:
Nick Mathewson
2006-10-19 23:04:49 +00:00
parent 26951e8709
commit bfdb93d8bd
6 changed files with 56 additions and 41 deletions
+2 -20
View File
@@ -359,7 +359,7 @@ static void
command_process_destroy_cell(cell_t *cell, or_connection_t *conn)
{
circuit_t *circ;
uint8_t reason;
int reason;
circ = circuit_get_by_circid_orconn(cell->circ_id, conn);
reason = (uint8_t)cell->payload[0];
@@ -378,25 +378,7 @@ command_process_destroy_cell(cell_t *cell, or_connection_t *conn)
} else { /* the destroy came from ahead */
circuit_set_n_circid_orconn(circ, 0, NULL);
if (CIRCUIT_IS_ORIGIN(circ)) {
/* Prevent arbitrary destroys from going unnoticed by controller */
if (reason == END_CIRC_REASON_NONE ||
reason == END_CIRC_REASON_FINISHED ||
reason == END_CIRC_REASON_REQUESTED) {
/* XXXX This logic is wrong. Really, we should report the fact that
* the circuit was closed because of a DESTROY, *and* we should report
* the reason that we were given. -NM
* Hrmm. We could store the fact that we sent a truncate and the
* reason for this truncate in circuit_t. If we ever get a destroy
* that doesn't match this reason, we could complain loudly -MP
* That won't work for the cases where the destroy is not because of
* a truncate, though. The idea is that if we get a DESTROYED cell
* with reason 'CONNECTFAILED' and another DESTROYED cell with reason
* 'RESOURCELIMIT', the controller may want to know the reported
* reason. -NM
*/
reason = END_CIRC_REASON_DESTROYED;
}
circuit_mark_for_close(circ, reason);
circuit_mark_for_close(circ, reason|END_CIRC_REASON_FLAG_REMOTE);
} else {
char payload[1];
log_debug(LD_OR, "Delivering 'truncated' back.");