diff options
author | Nick Mathewson <nickm@torproject.org> | 2014-03-27 15:58:43 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2014-03-27 15:58:43 -0400 |
commit | b0bbe6b2f1d8f0f2c83565f94d8a7dc5c5f72a91 (patch) | |
tree | 237ea0a4481d6ad83954959689ad3c52f6584e71 /src | |
parent | 0f395a7c064c314ca9dff4ac076b10461cc9b8c3 (diff) | |
download | tor-b0bbe6b2f1d8f0f2c83565f94d8a7dc5c5f72a91.tar.gz tor-b0bbe6b2f1d8f0f2c83565f94d8a7dc5c5f72a91.zip |
Report only the first bootstrap failure from an orconn
Otherwise, when we report "identity mismatch", we then later report
DONE when the connection gets closed.
Fixes bug 10431; bugfix on 0.2.1.1-alpha.
Diffstat (limited to 'src')
-rw-r--r-- | src/or/control.c | 7 | ||||
-rw-r--r-- | src/or/control.h | 2 | ||||
-rw-r--r-- | src/or/or.h | 4 | ||||
-rw-r--r-- | src/test/test_extorport.c | 2 |
4 files changed, 12 insertions, 3 deletions
diff --git a/src/or/control.c b/src/or/control.c index 23e2054f9e..43c0539ddb 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -4884,7 +4884,7 @@ control_event_bootstrap(bootstrap_status_t status, int progress) */ MOCK_IMPL(void, control_event_bootstrap_problem, (const char *warn, int reason, - const or_connection_t *or_conn)) + or_connection_t *or_conn)) { int status = bootstrap_percent; const char *tag, *summary; @@ -4895,6 +4895,11 @@ MOCK_IMPL(void, /* bootstrap_percent must not be in "undefined" state here. */ tor_assert(status >= 0); + if (or_conn->have_noted_bootstrap_problem) + return; + + or_conn->have_noted_bootstrap_problem = 1; + if (bootstrap_percent == 100) return; /* already bootstrapped; nothing to be done here. */ diff --git a/src/or/control.h b/src/or/control.h index ce605a1208..988c171d7f 100644 --- a/src/or/control.h +++ b/src/or/control.h @@ -94,7 +94,7 @@ void monitor_owning_controller_process(const char *process_spec); void control_event_bootstrap(bootstrap_status_t status, int progress); MOCK_DECL(void, control_event_bootstrap_problem,(const char *warn, int reason, - const or_connection_t *or_conn)); + or_connection_t *or_conn)); void control_event_clients_seen(const char *controller_str); void control_event_transport_launched(const char *mode, diff --git a/src/or/or.h b/src/or/or.h index 38ab1767e0..1ecded97d1 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1481,6 +1481,10 @@ typedef struct or_connection_t { unsigned int is_outgoing:1; unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */ unsigned int wide_circ_ids:1; + /** True iff this connection has had its bootstrap failure logged with + * control_event_bootstrap_problem. */ + unsigned int have_noted_bootstrap_problem:1; + uint16_t link_proto; /**< What protocol version are we using? 0 for * "none negotiated yet." */ diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c index b34f5e38de..f91ac7415e 100644 --- a/src/test/test_extorport.c +++ b/src/test/test_extorport.c @@ -364,7 +364,7 @@ test_ext_or_cookie_auth_testvec(void *arg) static void ignore_bootstrap_problem(const char *warn, int reason, - const or_connection_t *conn) + or_connection_t *conn) { (void)warn; (void)reason; |