diff --git a/changes/ticket27849 b/changes/ticket27849 new file mode 100644 index 0000000000..c2babeffc7 --- /dev/null +++ b/changes/ticket27849 @@ -0,0 +1,5 @@ + o Major bugfixes (mainloop, bootstrap): + - Make sure Tor bootstraps and works properly if only the ControlPort is + set. Prior to this fix, Tor would only bootstrap with at least a client + port being set (Socks, Trans, NATD, DNS or HTTPTunnel port). Fixes bug + 27849; bugfix on 0.3.4.1-alpha. diff --git a/src/or/main.c b/src/or/main.c index a93fdc3922..bc01e07c3d 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1493,13 +1493,18 @@ get_my_roles(const or_options_t *options) int roles = 0; int is_bridge = options->BridgeRelay; - int is_client = options_any_client_port_set(options); int is_relay = server_mode(options); int is_dirauth = authdir_mode_v3(options); int is_bridgeauth = authdir_mode_bridge(options); int is_hidden_service = !!hs_service_get_num_services() || !!rend_num_services(); int is_dirserver = dir_server_mode(options); + /* We also consider tor to have the role of a client if the ControlPort is + * set because a lot of things can be done over the control port which + * requires tor to have basic functionnalities. */ + int is_client = options_any_client_port_set(options) || + options->ControlPort_set || + options->OwningControllerFD >= 0; if (is_bridge) roles |= PERIODIC_EVENT_ROLE_BRIDGE; if (is_client) roles |= PERIODIC_EVENT_ROLE_CLIENT;