diff options
author | George Kadianakis <desnacked@riseup.net> | 2013-07-18 16:01:49 +0300 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2013-07-31 13:34:16 -0400 |
commit | 6e408060251e5a8136bb06353fcd8083ff3e28fa (patch) | |
tree | e3c2f3cb1be422be4dd6aa115bc4ff6ff2134f1c /src/or/transports.c | |
parent | dd44ff663e074d07a8bf8b94dc5d8b9d8dc3fb32 (diff) | |
download | tor-6e408060251e5a8136bb06353fcd8083ff3e28fa.tar.gz tor-6e408060251e5a8136bb06353fcd8083ff3e28fa.zip |
Fix invalid-read when a managed proxy configuration fails.
Diffstat (limited to 'src/or/transports.c')
-rw-r--r-- | src/or/transports.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/or/transports.c b/src/or/transports.c index cfec70340c..604d9fce82 100644 --- a/src/or/transports.c +++ b/src/or/transports.c @@ -106,7 +106,7 @@ static void managed_proxy_destroy(managed_proxy_t *mp, int also_terminate_process); static void handle_finished_proxy(managed_proxy_t *mp); -static void configure_proxy(managed_proxy_t *mp); +static int configure_proxy(managed_proxy_t *mp); static void parse_method_error(const char *line, int is_server_method); #define parse_server_method_error(l) parse_method_error(l, 1) @@ -573,10 +573,8 @@ pt_configure_remaining_proxies(void) /* If the proxy is not fully configured, try to configure it futher. */ if (!proxy_configuration_finished(mp)) - configure_proxy(mp); - - if (proxy_configuration_finished(mp)) - at_least_a_proxy_config_finished = 1; + if (configure_proxy(mp) == 1) + at_least_a_proxy_config_finished = 1; } SMARTLIST_FOREACH_END(mp); @@ -588,10 +586,14 @@ pt_configure_remaining_proxies(void) mark_my_descriptor_dirty("configured managed proxies"); } -/** Attempt to continue configuring managed proxy <b>mp</b>. */ -static void +/** Attempt to continue configuring managed proxy <b>mp</b>. + * Return 1 if the transport configuration finished, and return 0 + * otherwise (if we still have more configuring to do for this + * proxy). */ +static int configure_proxy(managed_proxy_t *mp) { + int configuration_finished = 0; smartlist_t *proxy_output = NULL; enum stream_status stream_status = 0; @@ -601,7 +603,7 @@ configure_proxy(managed_proxy_t *mp) mp->conf_state = PT_PROTO_FAILED_LAUNCH; handle_finished_proxy(mp); } - return; + return 0; } tor_assert(mp->conf_state != PT_PROTO_INFANT); @@ -633,13 +635,17 @@ configure_proxy(managed_proxy_t *mp) done: /* if the proxy finished configuring, exit the loop. */ - if (proxy_configuration_finished(mp)) + if (proxy_configuration_finished(mp)) { handle_finished_proxy(mp); + configuration_finished = 1; + } if (proxy_output) { SMARTLIST_FOREACH(proxy_output, char *, cp, tor_free(cp)); smartlist_free(proxy_output); } + + return configuration_finished; } /** Register server managed proxy <b>mp</b> transports to state */ |