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
circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell)
{
int retval = 0;
/* Should we send back a STOP cell? */
bool respond_with_stop = true;
circpad_negotiate_t *negotiate;
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);
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) {
log_info(LD_CIRC, "Received STOP command for old machine %u, ctr %u",
negotiate->machine_type, negotiate->machine_ctr);
......@@ -3023,10 +3031,13 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell)
retval = -1;
done:
if (respond_with_stop) {
circpad_padding_negotiated(circ, negotiate->machine_type,
negotiate->command,
(retval == 0) ? CIRCPAD_RESPONSE_OK : CIRCPAD_RESPONSE_ERR,
negotiate->machine_ctr);
}
circpad_negotiate_free(negotiate);
return retval;
......
......@@ -1367,7 +1367,7 @@ test_circuitpadding_wronghop(void *arg)
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_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);
/* 6. Sending negotiated command to relay does nothing */
......@@ -1396,11 +1396,9 @@ test_circuitpadding_wronghop(void *arg)
/* verify no padding was negotiated */
tt_ptr_op(relay_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 */
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);
/* 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