diff options
-rw-r--r-- | src/or/circuitbuild.c | 23 | ||||
-rw-r--r-- | src/or/circuitlist.c | 2 | ||||
-rw-r--r-- | src/or/circuituse.c | 8 | ||||
-rw-r--r-- | src/or/or.h | 1 | ||||
-rw-r--r-- | src/or/rendclient.c | 9 |
5 files changed, 24 insertions, 19 deletions
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 9d2b77286b..ce0127707a 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -246,7 +246,7 @@ again: return 0; /* if r == 1 */ } -/** Create and return new circuit. Initialize its purpose and +/** Create and return a new circuit. Initialize its purpose and * build-state based on our arguments. */ circuit_t * circuit_init(uint8_t purpose, int need_uptime, int need_capacity, int internal) { @@ -1168,8 +1168,9 @@ onion_pick_cpath_exit(circuit_t *circ, routerinfo_t *exit) { return 0; } -/** Take the open circ originating here, give it a new exit destination - * to <b>exit</b>, and get it to send the next extend cell. +/** Give <b>circ</b> a new exit destination to <b>exit</b>, and add a + * hop to the cpath reflecting this. Don't send the next extend cell -- + * the caller will do this if it wants to. */ int circuit_append_new_exit(circuit_t *circ, routerinfo_t *exit) { @@ -1183,6 +1184,22 @@ circuit_append_new_exit(circuit_t *circ, routerinfo_t *exit) { return 0; } +/** Take the open circ originating here, give it a new exit destination + * to <b>exit</b>, and get it to send the next extend cell. If you can't + * send the extend cell, mark the circuit for close and return -1, else + * return 0. */ +int circuit_extend_to_new_exit(circuit_t *circ, routerinfo_t *exit) { + circuit_append_new_exit(circ, exit); + circ->state = CIRCUIT_STATE_BUILDING; + if (circuit_send_next_onion_skin(circ)<0) { + log_fn(LOG_WARN, "Couldn't extend circuit to new point '%s'.", + circ->build_state->chosen_exit_name); + circuit_mark_for_close(circ); + return -1; + } + return 0; +} + /** Return the number of routers in <b>routers</b> that are currently up * and available for building circuits through. */ diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index a25c874fd9..f4add06090 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -77,7 +77,7 @@ void circuit_close_all_marked(void) circuit_t *circuit_new(uint16_t p_circ_id, connection_t *p_conn) { circuit_t *circ; static uint32_t n_circuits_allocated = 1; - /* never zero, since a global ID of 0 treated specially by the controller */ + /* never zero, since a global ID of 0 is treated specially by the controller */ circ = tor_malloc_zero(sizeof(circuit_t)); circ->magic = CIRCUIT_MAGIC; diff --git a/src/or/circuituse.c b/src/or/circuituse.c index ea51a4c2d1..669d96e94e 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -722,14 +722,8 @@ circuit_launch_by_router(uint8_t purpose, routerinfo_t *exit, case CIRCUIT_PURPOSE_S_CONNECT_REND: /* need to add a new hop */ tor_assert(exit); - circuit_append_new_exit(circ, exit); - circ->state = CIRCUIT_STATE_BUILDING; - if (circuit_send_next_onion_skin(circ)<0) { - log_fn(LOG_WARN, "Couldn't extend circuit to new point '%s'.", - circ->build_state->chosen_exit_name); - circuit_mark_for_close(circ); + if (circuit_extend_to_new_exit(circ, exit) < 0) return NULL; - } break; default: log_fn(LOG_WARN,"Bug: unexpected purpose %d when cannibalizing a general circ.", diff --git a/src/or/or.h b/src/or/or.h index d35e95e3f1..9c6af5e5cc 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1137,6 +1137,7 @@ int circuit_all_predicted_ports_handled(time_t now, int *need_uptime, int *need_capacity); int circuit_append_new_exit(circuit_t *circ, routerinfo_t *exit); +int circuit_extend_to_new_exit(circuit_t *circ, routerinfo_t *exit); void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop); /********************************* circuitlist.c ***********************/ diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 7f44bc24f6..612d3f6b23 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -226,14 +226,7 @@ rend_client_introduction_acked(circuit_t *circ, log_fn(LOG_INFO, "Chose new intro point %s for %s (circ %d)", nickname, circ->rend_query, circ->n_circ_id); tor_free(nickname); - circuit_append_new_exit(circ, r); - circ->state = CIRCUIT_STATE_BUILDING; - if (circuit_send_next_onion_skin(circ)<0) { - log_fn(LOG_WARN, "Couldn't extend circuit to new point '%s'.", - circ->build_state->chosen_exit_name); - circuit_mark_for_close(circ); - return -1; - } + return circuit_extend_to_new_exit(circ, r); } } return 0; |