Loading changes/bug40435 0 → 100644 +4 −0 Original line number Original line Diff line number Diff line 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 src/core/or/circuitpadding.c +15 −4 Original line number Original line Diff line number Diff line Loading @@ -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)) { Loading @@ -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); Loading Loading @@ -3023,10 +3031,13 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell) retval = -1; retval = -1; done: done: if (respond_with_stop) { circpad_padding_negotiated(circ, negotiate->machine_type, circpad_padding_negotiated(circ, negotiate->machine_type, negotiate->command, negotiate->command, (retval == 0) ? CIRCPAD_RESPONSE_OK : CIRCPAD_RESPONSE_ERR, (retval == 0) ? CIRCPAD_RESPONSE_OK : CIRCPAD_RESPONSE_ERR, negotiate->machine_ctr); negotiate->machine_ctr); } circpad_negotiate_free(negotiate); circpad_negotiate_free(negotiate); return retval; return retval; Loading src/test/test_circuitpadding.c +2 −4 Original line number Original line Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 */ Loading Loading
changes/bug40435 0 → 100644 +4 −0 Original line number Original line Diff line number Diff line 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
src/core/or/circuitpadding.c +15 −4 Original line number Original line Diff line number Diff line Loading @@ -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)) { Loading @@ -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); Loading Loading @@ -3023,10 +3031,13 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell) retval = -1; retval = -1; done: done: if (respond_with_stop) { circpad_padding_negotiated(circ, negotiate->machine_type, circpad_padding_negotiated(circ, negotiate->machine_type, negotiate->command, negotiate->command, (retval == 0) ? CIRCPAD_RESPONSE_OK : CIRCPAD_RESPONSE_ERR, (retval == 0) ? CIRCPAD_RESPONSE_OK : CIRCPAD_RESPONSE_ERR, negotiate->machine_ctr); negotiate->machine_ctr); } circpad_negotiate_free(negotiate); circpad_negotiate_free(negotiate); return retval; return retval; Loading
src/test/test_circuitpadding.c +2 −4 Original line number Original line Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 */ Loading