Merge remote-tracking branch 'public/bug10722'

This commit is contained in:
Nick Mathewson 2014-02-11 10:08:58 -05:00
commit cb28fe486f
2 changed files with 31 additions and 4 deletions

8
changes/bug10722 Normal file
View File

@ -0,0 +1,8 @@
o Minor bugfixes:
- Consider non-excluded hidden service directory servers before
excluded ones. Do not consider excluded hidden service directory
servers at all if StrictNodes was set. (Previously, we would
sometimes decide to connect to those servers, and then realize
before we initiated a connection that we had excluded them.)
Fix for bug #10722. Bugfix on 0.2.0.10-alpha. Reported by
"mr-4".

View File

@ -619,11 +619,14 @@ static int
directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query) directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query)
{ {
smartlist_t *responsible_dirs = smartlist_new(); smartlist_t *responsible_dirs = smartlist_new();
smartlist_t *usable_responsible_dirs = smartlist_new();
const or_options_t *options = get_options();
routerstatus_t *hs_dir; routerstatus_t *hs_dir;
char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
time_t now = time(NULL); time_t now = time(NULL);
char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64]; char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64];
int tor2web_mode = get_options()->Tor2webMode; const int tor2web_mode = options->Tor2webMode;
int excluded_some;
tor_assert(desc_id); tor_assert(desc_id);
tor_assert(rend_query); tor_assert(rend_query);
/* Determine responsible dirs. Even if we can't get all we want, /* Determine responsible dirs. Even if we can't get all we want,
@ -644,16 +647,32 @@ directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query)
dir, desc_id_base32, rend_query, 0, 0); dir, desc_id_base32, rend_query, 0, 0);
const node_t *node = node_get_by_id(dir->identity_digest); const node_t *node = node_get_by_id(dir->identity_digest);
if (last + REND_HID_SERV_DIR_REQUERY_PERIOD >= now || if (last + REND_HID_SERV_DIR_REQUERY_PERIOD >= now ||
!node || !node_has_descriptor(node)) !node || !node_has_descriptor(node)) {
SMARTLIST_DEL_CURRENT(responsible_dirs, dir); SMARTLIST_DEL_CURRENT(responsible_dirs, dir);
continue;
}
if (! routerset_contains_node(options->ExcludeNodes, node)) {
smartlist_add(usable_responsible_dirs, dir);
}
}); });
excluded_some =
smartlist_len(usable_responsible_dirs) < smartlist_len(responsible_dirs);
hs_dir = smartlist_choose(usable_responsible_dirs);
if (! hs_dir && ! options->StrictNodes)
hs_dir = smartlist_choose(responsible_dirs); hs_dir = smartlist_choose(responsible_dirs);
smartlist_free(responsible_dirs); smartlist_free(responsible_dirs);
smartlist_free(usable_responsible_dirs);
if (!hs_dir) { if (!hs_dir) {
log_info(LD_REND, "Could not pick one of the responsible hidden " log_info(LD_REND, "Could not pick one of the responsible hidden "
"service directories, because we requested them all " "service directories, because we requested them all "
"recently without success."); "recently without success.");
if (options->StrictNodes && excluded_some) {
log_info(LD_REND, "There are others that we could have tried, but "
"they are all excluded, and StrictNodes is set.");
}
return 0; return 0;
} }