From f90bfaae8dabb6acf7656b20f1bc0513a683a0dd Mon Sep 17 00:00:00 2001 From: "teor (Tim Wilson-Brown)" Date: Fri, 1 Jul 2016 10:18:28 +1000 Subject: [PATCH] Refactor duplicate code in authority_certs_fetch_missing --- src/or/routerlist.c | 69 ++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/src/or/routerlist.c b/src/or/routerlist.c index cae0241343..c08d1a33f3 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -834,6 +834,33 @@ authority_cert_dl_looks_uncertain(const char *id_digest) return n_failures >= N_AUTH_CERT_DL_FAILURES_TO_BUG_USER; } +/* Fetch the authority certificates specified in resource. + * If rs is not NULL, fetch from rs, otherwise, fetch from a random directory + * mirror. */ +static void +authority_certs_fetch_resource_impl(const char *resource, + const routerstatus_t *rs) +{ + if (rs) { + /* If we've just downloaded a consensus from a directory, re-use that + * directory */ + int get_via_tor = purpose_needs_anonymity( + DIR_PURPOSE_FETCH_CERTIFICATE, 0); + const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS + : DIRIND_ONEHOP; + directory_initiate_command_routerstatus(rs, + DIR_PURPOSE_FETCH_CERTIFICATE, + 0, indirection, resource, NULL, + 0, 0); + } else { + /* Otherwise, we want certs from a random fallback or directory + * mirror, because they will almost always succeed. */ + directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, + resource, PDS_RETRY_IF_NO_SERVERS, + DL_WANT_ANY_DIRSERVER); + } +} + /** Try to download any v3 authority certificates that we may be missing. If * status is provided, try to get all the ones that were used to sign * status. Additionally, try to have a non-expired certificate for @@ -1072,25 +1099,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, if (smartlist_len(fps) > 1) { resource = smartlist_join_strings(fps, "", 0, NULL); - - /* If we've just downloaded a consensus from a directory, re-use that - * directory */ - if (rs) { - int get_via_tor = purpose_needs_anonymity( - DIR_PURPOSE_FETCH_CERTIFICATE, 0); - const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS - : DIRIND_ONEHOP; - directory_initiate_command_routerstatus(rs, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, indirection, resource, NULL, - 0, 0); - } else { - /* Otherwise, we want certs from a random fallback or directory - * mirror, because they will almost always succeed. */ - directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, - resource, PDS_RETRY_IF_NO_SERVERS, - DL_WANT_ANY_DIRSERVER); - } + /* rs is the directory that just gave us a consensus or certificates */ + authority_certs_fetch_resource_impl(resource, rs); tor_free(resource); } /* else we didn't add any: they were all pending */ @@ -1133,25 +1143,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, if (smartlist_len(fp_pairs) > 1) { resource = smartlist_join_strings(fp_pairs, "", 0, NULL); - - /* If we've just downloaded a consensus from a directory, re-use that - * directory */ - if (rs) { - int get_via_tor = purpose_needs_anonymity( - DIR_PURPOSE_FETCH_CERTIFICATE, 0); - const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS - : DIRIND_ONEHOP; - directory_initiate_command_routerstatus(rs, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, indirection, resource, NULL, - 0, 0); - } else { - /* Otherwise, we want certs from a random fallback or directory - * mirror, because they will almost always succeed. */ - directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, - resource, PDS_RETRY_IF_NO_SERVERS, - DL_WANT_ANY_DIRSERVER); - } + /* rs is the directory that just gave us a consensus or certificates */ + authority_certs_fetch_resource_impl(resource, rs); tor_free(resource); } /* else they were all pending */