mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 15:10:48 +01:00
Merge branch 'bug23360_032_01'
This commit is contained in:
commit
85688dc33d
3 changed files with 6 additions and 99 deletions
|
@ -964,8 +964,6 @@ service_descriptor_free(hs_service_descriptor_t *desc)
|
|||
hs_descriptor_free(desc->desc);
|
||||
memwipe(&desc->signing_kp, 0, sizeof(desc->signing_kp));
|
||||
memwipe(&desc->blinded_kp, 0, sizeof(desc->blinded_kp));
|
||||
SMARTLIST_FOREACH(desc->hsdir_missing_info, char *, id, tor_free(id));
|
||||
smartlist_free(desc->hsdir_missing_info);
|
||||
/* Cleanup all intro points. */
|
||||
digest256map_free(desc->intro_points.map, service_intro_point_free_);
|
||||
digestmap_free(desc->intro_points.failed_id, tor_free_);
|
||||
|
@ -985,7 +983,6 @@ service_descriptor_new(void)
|
|||
/* Initialize the intro points map. */
|
||||
sdesc->intro_points.map = digest256map_new();
|
||||
sdesc->intro_points.failed_id = digestmap_new();
|
||||
sdesc->hsdir_missing_info = smartlist_new();
|
||||
sdesc->previous_hsdirs = smartlist_new();
|
||||
return sdesc;
|
||||
}
|
||||
|
@ -2343,18 +2340,6 @@ upload_descriptor_to_all(const hs_service_t *service,
|
|||
/* Getting responsible hsdir implies that the node_t object exists for the
|
||||
* routerstatus_t found in the consensus else we have a problem. */
|
||||
tor_assert(hsdir_node);
|
||||
/* Do not upload to an HSDir we don't have a descriptor for. */
|
||||
if (!node_has_descriptor(hsdir_node)) {
|
||||
log_info(LD_REND, "Missing descriptor for HSDir %s. Not uploading "
|
||||
"descriptor. We'll try later once we have it.",
|
||||
safe_str_client(node_describe(hsdir_node)));
|
||||
/* Once we get new directory information, this HSDir will be retried if
|
||||
* we ever get the descriptor. */
|
||||
smartlist_add(desc->hsdir_missing_info,
|
||||
tor_memdup(hsdir_rs->identity_digest, DIGEST_LEN));
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Upload this descriptor to the chosen directory. */
|
||||
upload_descriptor_to_hsdir(service, desc, hsdir_node);
|
||||
} SMARTLIST_FOREACH_END(hsdir_rs);
|
||||
|
@ -2743,58 +2728,6 @@ service_handle_introduce2(origin_circuit_t *circ, const uint8_t *payload,
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* For a given service and a descriptor of that service, consider retrying to
|
||||
* upload the descriptor to any directories from which we had missing
|
||||
* information when originally tried to be uploaded. This is called when our
|
||||
* directory information has changed. */
|
||||
static void
|
||||
consider_hsdir_upload_retry(const hs_service_t *service,
|
||||
hs_service_descriptor_t *desc)
|
||||
{
|
||||
smartlist_t *responsible_dirs = NULL;
|
||||
smartlist_t *still_missing_dirs = NULL;
|
||||
|
||||
tor_assert(service);
|
||||
tor_assert(desc);
|
||||
|
||||
responsible_dirs = smartlist_new();
|
||||
still_missing_dirs = smartlist_new();
|
||||
|
||||
/* We first need to get responsible directories from the latest consensus so
|
||||
* we can then make sure that the node that we were missing information for
|
||||
* is still responsible for this descriptor. */
|
||||
hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num,
|
||||
service->desc_next == desc, 0, responsible_dirs);
|
||||
|
||||
SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *, rs) {
|
||||
const node_t *node;
|
||||
const char *id = rs->identity_digest;
|
||||
if (!smartlist_contains_digest(desc->hsdir_missing_info, id)) {
|
||||
continue;
|
||||
}
|
||||
/* We do need a node_t object and descriptor to perform an upload. If
|
||||
* found, we remove the id from the missing dir list else we add it to the
|
||||
* still missing dir list to keep track of id that are still missing. */
|
||||
node = node_get_by_id(id);
|
||||
if (node && node_has_descriptor(node)) {
|
||||
upload_descriptor_to_hsdir(service, desc, node);
|
||||
smartlist_remove(desc->hsdir_missing_info, id);
|
||||
} else {
|
||||
smartlist_add(still_missing_dirs, tor_memdup(id, DIGEST_LEN));
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(rs);
|
||||
|
||||
/* Switch the still missing dir list with the current missing dir list in
|
||||
* the descriptor. It is possible that the list ends up empty which is what
|
||||
* we want if we have no more missing dir. */
|
||||
SMARTLIST_FOREACH(desc->hsdir_missing_info, char *, id, tor_free(id));
|
||||
smartlist_free(desc->hsdir_missing_info);
|
||||
desc->hsdir_missing_info = still_missing_dirs;
|
||||
|
||||
/* No ownership of the routerstatus_t object in this list. */
|
||||
smartlist_free(responsible_dirs);
|
||||
}
|
||||
|
||||
/* Add to list every filename used by service. This is used by the sandbox
|
||||
* subsystem. */
|
||||
static void
|
||||
|
@ -2821,16 +2754,6 @@ service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list)
|
|||
/* Public API */
|
||||
/* ========== */
|
||||
|
||||
/* We just received a new batch of descriptors which might affect the shape of
|
||||
* the HSDir hash ring. Signal that we should reexamine the hash ring and
|
||||
* re-upload our HS descriptors if needed. */
|
||||
void
|
||||
hs_hsdir_set_changed_consider_reupload(void)
|
||||
{
|
||||
log_info(LD_REND, "New dirinfo arrived: consider reuploading descriptor");
|
||||
consider_republishing_hs_descriptors = 1;
|
||||
}
|
||||
|
||||
/* Return the number of service we have configured and usable. */
|
||||
unsigned int
|
||||
hs_service_get_num_services(void)
|
||||
|
@ -3000,22 +2923,14 @@ hs_service_lists_fnames_for_sandbox(smartlist_t *file_list,
|
|||
}
|
||||
|
||||
/* Called when our internal view of the directory has changed. We might have
|
||||
* new descriptors for hidden service directories that we didn't have before
|
||||
* so try them if it's the case. */
|
||||
* received a new batch of descriptors which might affect the shape of the
|
||||
* HSDir hash ring. Signal that we should reexamine the hash ring and
|
||||
* re-upload our HS descriptors if needed. */
|
||||
void
|
||||
hs_service_dir_info_changed(void)
|
||||
{
|
||||
/* For each service we have, check every descriptor and consider retrying to
|
||||
* upload it to directories that we might have had missing information
|
||||
* previously that is missing a router descriptor. */
|
||||
FOR_EACH_SERVICE_BEGIN(service) {
|
||||
FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
|
||||
/* This cleans up the descriptor missing hsdir information list if a
|
||||
* successful upload is made or if any of the directory aren't
|
||||
* responsible anymore for the service descriptor. */
|
||||
consider_hsdir_upload_retry(service, desc);
|
||||
} FOR_EACH_DESCRIPTOR_END;
|
||||
} FOR_EACH_SERVICE_END;
|
||||
log_info(LD_REND, "New dirinfo arrived: consider reuploading descriptor");
|
||||
consider_republishing_hs_descriptors = 1;
|
||||
}
|
||||
|
||||
/* Called when we get an INTRODUCE2 cell on the circ. Respond to the cell and
|
||||
|
|
|
@ -123,13 +123,6 @@ typedef struct hs_service_descriptor_t {
|
|||
* couldn't pick any nodes. */
|
||||
unsigned int missing_intro_points : 1;
|
||||
|
||||
/* List of identity digests for hidden service directories to which we
|
||||
* couldn't upload this descriptor because we didn't have its router
|
||||
* descriptor at the time. If this list is non-empty, only the relays in this
|
||||
* list are re-tried to upload this descriptor when our directory information
|
||||
* have been updated. */
|
||||
smartlist_t *hsdir_missing_info;
|
||||
|
||||
/** List of the responsible HSDirs (their b64ed identity digest) last time we
|
||||
* uploaded this descriptor. If the set of responsible HSDirs is different
|
||||
* from this list, this means we received new dirinfo and we need to
|
||||
|
@ -266,7 +259,6 @@ void hs_service_lists_fnames_for_sandbox(smartlist_t *file_list,
|
|||
smartlist_t *dir_list);
|
||||
int hs_service_set_conn_addr_port(const origin_circuit_t *circ,
|
||||
edge_connection_t *conn);
|
||||
void hs_hsdir_set_changed_consider_reupload(void);
|
||||
|
||||
void hs_service_dir_info_changed(void);
|
||||
void hs_service_run_scheduled_events(time_t now);
|
||||
|
|
|
@ -1810,7 +1810,7 @@ router_dir_info_changed(void)
|
|||
{
|
||||
need_to_update_have_min_dir_info = 1;
|
||||
rend_hsdir_routers_changed();
|
||||
hs_hsdir_set_changed_consider_reupload();
|
||||
hs_service_dir_info_changed();
|
||||
}
|
||||
|
||||
/** Return a string describing what we're missing before we have enough
|
||||
|
|
Loading…
Add table
Reference in a new issue