Commit 984a28f3 authored by David Goulet's avatar David Goulet 🔆 Committed by Nick Mathewson
Browse files

hs-v3: Make service pick the exact amount of intro points

When encoding introduction points, we were not checking if that intro points
had an established circuit.

When botting up, the service will pick, by default, 3 + 2 intro points and the
first 3 that establish, we use them and upload the descriptor.

However, the intro point is removed from the service descriptor list only when
the circuit has opened and we see that we have already enough intro points, it
is then removed.

But it is possible that the service establishes 3 intro points successfully
before the other(s) have even opened yet.

This lead to the service encoding extra intro points in the descriptor even
though the circuit is not opened or might never establish (#31561).

Fixes #31548
Signed-off-by: David Goulet's avatarDavid Goulet <>
parent 190386f1
o Major bugfixes (hidden service v3):
- Make onion service always use the exact amount of configured intro points
(or less due to node exlusion). Before, a service could sometimes pick
more intro points than configured with the
HiddenServiceNumIntroductionPoints option. Fixes bug 31548; bugfix on
......@@ -1686,6 +1686,15 @@ build_desc_intro_points(const hs_service_t *service,
DIGEST256MAP_FOREACH(desc->, key,
const hs_service_intro_point_t *, ip) {
if (!ip->circuit_established) {
/* Ignore un-established intro points. They can linger in that list
* because their circuit has not opened and they haven't been removed
* yet even though we have enough intro circuits.
* Due to #31561, it can stay in that list until rotation so this check
* prevents to publish an intro point without a circuit. */
hs_desc_intro_point_t *desc_ip = hs_desc_intro_point_new();
if (setup_desc_intro_point(&desc->signing_kp, ip, now, desc_ip) < 0) {
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