mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Make last_hid_serv_requests functions less fragile
Previously, Tor would dereference a NULL pointer and crash if lookup_last_hid_serv_request were called before the first call to directory_clean_last_hid_serv_requests. As far as I can tell, that's currently impossible, but I want that undocumented invariant to go away in case I^Wwe break it someday.
This commit is contained in:
+13
-3
@@ -377,7 +377,17 @@ rend_client_introduction_acked(origin_circuit_t *circ,
|
||||
* certain queries; keys are strings consisting of base32-encoded
|
||||
* hidden service directory identities and base32-encoded descriptor IDs;
|
||||
* values are pointers to timestamps of the last requests. */
|
||||
static strmap_t *last_hid_serv_requests = NULL;
|
||||
static strmap_t *last_hid_serv_requests_ = NULL;
|
||||
|
||||
/** Returns last_hid_serv_requests_, initializing it to a new strmap if
|
||||
* necessary. */
|
||||
static strmap_t *
|
||||
get_last_hid_serv_requests(void)
|
||||
{
|
||||
if (!last_hid_serv_requests_)
|
||||
last_hid_serv_requests_ = strmap_new();
|
||||
return last_hid_serv_requests_;
|
||||
}
|
||||
|
||||
/** Look up the last request time to hidden service directory <b>hs_dir</b>
|
||||
* for descriptor ID <b>desc_id_base32</b>. If <b>set</b> is non-zero,
|
||||
@@ -391,6 +401,7 @@ lookup_last_hid_serv_request(routerstatus_t *hs_dir,
|
||||
char hsdir_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
|
||||
char hsdir_desc_comb_id[2 * REND_DESC_ID_V2_LEN_BASE32 + 1];
|
||||
time_t *last_request_ptr;
|
||||
strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
|
||||
base32_encode(hsdir_id_base32, sizeof(hsdir_id_base32),
|
||||
hs_dir->identity_digest, DIGEST_LEN);
|
||||
tor_snprintf(hsdir_desc_comb_id, sizeof(hsdir_desc_comb_id), "%s%s",
|
||||
@@ -416,8 +427,7 @@ directory_clean_last_hid_serv_requests(void)
|
||||
{
|
||||
strmap_iter_t *iter;
|
||||
time_t cutoff = time(NULL) - REND_HID_SERV_DIR_REQUERY_PERIOD;
|
||||
if (!last_hid_serv_requests)
|
||||
last_hid_serv_requests = strmap_new();
|
||||
strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
|
||||
for (iter = strmap_iter_init(last_hid_serv_requests);
|
||||
!strmap_iter_done(iter); ) {
|
||||
const char *key;
|
||||
|
||||
Reference in New Issue
Block a user