Merge remote-tracking branch 'tor-gitlab/mr/412'

This commit is contained in:
Nick Mathewson 2021-07-23 15:06:06 -04:00
commit a9b287fbcc
3 changed files with 21 additions and 8 deletions

4
changes/bug40435 Normal file
View File

@ -0,0 +1,4 @@
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.

View File

@ -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)
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)
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;

View File

@ -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)
/* 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 */