Commit 9d5c63dc authored by George Kadianakis's avatar George Kadianakis
Browse files

circpad: Be more smart on when to send back STOP cells.

parent 27d6b3ae
Pipeline #9762 passed with stage
in 10 minutes and 30 seconds
o Minor bugfixes (circuit padding):
- Don't send STOP circuit padding cells when the other side has already
shut down the corresponding padding machine. Fixes bug 40435; bugfix on
0.4.0.1-alpha.
\ No newline at end of file
...@@ -2967,6 +2967,8 @@ signed_error_t ...@@ -2967,6 +2967,8 @@ signed_error_t
circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell) circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell)
{ {
int retval = 0; int retval = 0;
/* Should we send back a STOP cell? */
bool respond_with_stop = true;
circpad_negotiate_t *negotiate; circpad_negotiate_t *negotiate;
if (CIRCUIT_IS_ORIGIN(circ)) { if (CIRCUIT_IS_ORIGIN(circ)) {
...@@ -2992,6 +2994,12 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell) ...@@ -2992,6 +2994,12 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell)
negotiate->machine_type, negotiate->machine_ctr); negotiate->machine_type, negotiate->machine_ctr);
goto done; goto done;
} }
/* If we reached this point we received a STOP command from an old or
unknown machine. Don't reply with our own STOP since there is no one to
handle it on the other end */
respond_with_stop = false;
if (negotiate->machine_ctr <= circ->padding_machine_ctr) { if (negotiate->machine_ctr <= circ->padding_machine_ctr) {
log_info(LD_CIRC, "Received STOP command for old machine %u, ctr %u", log_info(LD_CIRC, "Received STOP command for old machine %u, ctr %u",
negotiate->machine_type, negotiate->machine_ctr); negotiate->machine_type, negotiate->machine_ctr);
...@@ -3023,10 +3031,13 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell) ...@@ -3023,10 +3031,13 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell)
retval = -1; retval = -1;
done: done:
circpad_padding_negotiated(circ, negotiate->machine_type, if (respond_with_stop) {
negotiate->command, circpad_padding_negotiated(circ, negotiate->machine_type,
(retval == 0) ? CIRCPAD_RESPONSE_OK : CIRCPAD_RESPONSE_ERR, negotiate->command,
negotiate->machine_ctr); (retval == 0) ? CIRCPAD_RESPONSE_OK : CIRCPAD_RESPONSE_ERR,
negotiate->machine_ctr);
}
circpad_negotiate_free(negotiate); circpad_negotiate_free(negotiate);
return retval; return retval;
......
...@@ -1367,7 +1367,7 @@ test_circuitpadding_wronghop(void *arg) ...@@ -1367,7 +1367,7 @@ test_circuitpadding_wronghop(void *arg)
tt_ptr_op(client_side->padding_info[0], OP_NE, NULL); tt_ptr_op(client_side->padding_info[0], OP_NE, NULL);
tt_ptr_op(relay_side->padding_machine[0], OP_NE, NULL); tt_ptr_op(relay_side->padding_machine[0], OP_NE, NULL);
tt_ptr_op(relay_side->padding_info[0], OP_NE, NULL); tt_ptr_op(relay_side->padding_info[0], OP_NE, NULL);
tt_int_op(n_relay_cells, OP_EQ, 3); tt_int_op(n_relay_cells, OP_EQ, 2);
tt_int_op(n_client_cells, OP_EQ, 2); tt_int_op(n_client_cells, OP_EQ, 2);
/* 6. Sending negotiated command to relay does nothing */ /* 6. Sending negotiated command to relay does nothing */
...@@ -1396,11 +1396,9 @@ test_circuitpadding_wronghop(void *arg) ...@@ -1396,11 +1396,9 @@ test_circuitpadding_wronghop(void *arg)
/* verify no padding was negotiated */ /* verify no padding was negotiated */
tt_ptr_op(relay_side->padding_machine[0], OP_EQ, NULL); tt_ptr_op(relay_side->padding_machine[0], OP_EQ, NULL);
tt_ptr_op(client_side->padding_machine[0], OP_EQ, NULL); tt_ptr_op(client_side->padding_machine[0], OP_EQ, NULL);
tt_int_op(n_relay_cells, OP_EQ, 3);
tt_int_op(n_client_cells, OP_EQ, 2);
/* verify no echo was sent */ /* verify no echo was sent */
tt_int_op(n_relay_cells, OP_EQ, 3); tt_int_op(n_relay_cells, OP_EQ, 2);
tt_int_op(n_client_cells, OP_EQ, 2); tt_int_op(n_client_cells, OP_EQ, 2);
/* Finish circuit */ /* Finish circuit */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment