Commit df662530 authored by David Goulet's avatar David Goulet 🐼
Browse files

Merge branch 'tor-gitlab/mr/543'

parents c076ac78 069b2786
Loading
Loading
Loading
Loading

changes/ticket40576

0 → 100644
+5 −0
Original line number Diff line number Diff line
  o Minor bugfixes (onion service congestion control):
    - Avoid a non fatal assert in case we can't setup congestion control on the
      rendezvous circuit after opening. Fixes bug 40576; bugfix on
      0.4.7.4-alpha.
+23 −6
Original line number Diff line number Diff line
@@ -644,6 +644,16 @@ send_introduce1(origin_circuit_t *intro_circ,
    goto tran_err;
  }

  /* Check if the rendevous circuit was setup WITHOUT congestion control but if
   * it is enabled and the service supports it. This can happen, see
   * setup_rendezvous_circ_congestion_control() and so close rendezvous circuit
   * so another one can be created. */
  if (TO_CIRCUIT(rend_circ)->ccontrol == NULL && congestion_control_enabled()
      && hs_desc_supports_congestion_control(desc)) {
    circuit_mark_for_close(TO_CIRCUIT(rend_circ), END_CIRC_REASON_INTERNAL);
    goto tran_err;
  }

  /* We need to find which intro point in the descriptor we are connected to
   * on intro_circ. */
  ip = find_desc_intro_point_by_ident(intro_circ->hs_ident, desc);
@@ -780,7 +790,14 @@ client_intro_circ_has_opened(origin_circuit_t *circ)
}

/** Setup the congestion control parameters on the given rendezvous circuit.
 * This looks at the service descriptor flow control line (if any). */
 * This looks at the service descriptor flow control line (if any).
 *
 * It is possible that we are unable to set congestion control on the circuit
 * if the descriptor can't be found. In that case, the introduction circuit
 * can't be opened without it so a fetch will be triggered.
 *
 * However, if the descriptor asks for congestion control but the RP circuit
 * doesn't have it, it will be closed and a new circuit will be opened. */
static void
setup_rendezvous_circ_congestion_control(origin_circuit_t *circ)
{
@@ -791,16 +808,16 @@ setup_rendezvous_circ_congestion_control(origin_circuit_t *circ)
  /* Setup congestion control parameters on the circuit. */
  const hs_descriptor_t *desc =
    hs_cache_lookup_as_client(&circ->hs_ident->identity_pk);
  if (BUG(desc == NULL)) {
    /* This should really never happened but in case, scream and stop. */
  if (desc == NULL) {
    /* This is possible because between launching the circuit and the circuit
     * ending in opened state, the descriptor could have been removed from the
     * cache. In this case, we just can't setup congestion control. */
    return;
  }

  /* Check if the service lists support for congestion control in its
   * descriptor. If not, we don't setup congestion control. */
  if (!desc->encrypted_data.flow_control_pv ||
      !protocol_list_supports_protocol(desc->encrypted_data.flow_control_pv,
                                       PRT_FLOWCTRL, PROTOVER_FLOWCTRL_CC)) {
  if (!hs_desc_supports_congestion_control(desc)) {
    return;
  }

+13 −0
Original line number Diff line number Diff line
@@ -2987,3 +2987,16 @@ hs_descriptor_clear_intro_points(hs_descriptor_t *desc)
    smartlist_clear(ips);
  }
}

/** Return true iff we support the given descriptor congestion control
 * parameters. */
bool
hs_desc_supports_congestion_control(const hs_descriptor_t *desc)
{
  tor_assert(desc);

  /* Validate that we support the protocol version in the descriptor. */
  return desc->encrypted_data.flow_control_pv &&
         protocol_list_supports_protocol(desc->encrypted_data.flow_control_pv,
                                         PRT_FLOWCTRL, PROTOVER_FLOWCTRL_CC);
}
+2 −0
Original line number Diff line number Diff line
@@ -319,6 +319,8 @@ void hs_desc_superencrypted_data_free_contents(
                                        hs_desc_superencrypted_data_t *desc);
void hs_desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc);

bool hs_desc_supports_congestion_control(const hs_descriptor_t *desc);

#ifdef HS_DESCRIPTOR_PRIVATE

/* Encoding. */