diff options
author | Nick Mathewson <nickm@torproject.org> | 2015-09-01 09:30:48 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2015-09-01 09:30:48 -0400 |
commit | a55f257d6a601c498f5a114552f97afe468de8a1 (patch) | |
tree | f1d29fd3cb9e872f97677155ae2e271e40826a3e | |
parent | 2c5fec15f7542a3190e3f406820c998bdecdc5f7 (diff) | |
download | tor-a55f257d6a601c498f5a114552f97afe468de8a1.tar.gz tor-a55f257d6a601c498f5a114552f97afe468de8a1.zip |
Simplify API for find_rp_for_intro()
The function now unconditionally allocates a new extend_info_t.
This should convince coverity that we're not leaking memory.
(CID 1311875)
-rw-r--r-- | src/or/rendservice.c | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/src/or/rendservice.c b/src/or/rendservice.c index db6bc4b72e..f3a09ddaf2 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -40,7 +40,7 @@ static rend_intro_point_t *find_expiring_intro_point( static extend_info_t *find_rp_for_intro( const rend_intro_cell_t *intro, - uint8_t *need_free_out, char **err_msg_out); + char **err_msg_out); static int intro_point_accepted_intro_count(rend_intro_point_t *intro); static int intro_point_should_expire_now(rend_intro_point_t *intro, @@ -1456,13 +1456,6 @@ rend_service_receive_introduction(origin_circuit_t *circuit, rend_intro_cell_t *parsed_req = NULL; /* Rendezvous point */ extend_info_t *rp = NULL; - /* - * We need to look up and construct the extend_info_t for v0 and v1, - * but all the info is in the cell and it's constructed by the parser - * for v2 and v3, so freeing it would be a double-free. Use this to - * keep track of whether we should free it. - */ - uint8_t need_rp_free = 0; /* XXX not handled yet */ char buf[RELAY_PAYLOAD_SIZE]; char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; /* Holds KH, Df, Db, Kf, Kb */ @@ -1602,7 +1595,7 @@ rend_service_receive_introduction(origin_circuit_t *circuit, ++(intro_point->accepted_introduce2_count); /* Find the rendezvous point */ - rp = find_rp_for_intro(parsed_req, &need_rp_free, &err_msg); + rp = find_rp_for_intro(parsed_req, &err_msg); if (!rp) goto log_error; @@ -1761,27 +1754,25 @@ rend_service_receive_introduction(origin_circuit_t *circuit, /* Free the parsed cell */ rend_service_free_intro(parsed_req); - /* Free rp if we must */ - if (need_rp_free) extend_info_free(rp); + /* Free rp */ + extend_info_free(rp); return status; } /** Given a parsed and decrypted INTRODUCE2, find the rendezvous point or - * return NULL and an error string if we can't. - */ - + * return NULL and an error string if we can't. Return a newly allocated + * extend_info_t* for the introduction point. */ static extend_info_t * find_rp_for_intro(const rend_intro_cell_t *intro, - uint8_t *need_free_out, char **err_msg_out) + char **err_msg_out) { extend_info_t *rp = NULL; char *err_msg = NULL; const char *rp_nickname = NULL; const node_t *node = NULL; - uint8_t need_free = 0; - if (!intro || !need_free_out) { + if (!intro) { if (err_msg_out) err_msg = tor_strdup("Bad parameters to find_rp_for_intro()"); @@ -1812,13 +1803,11 @@ find_rp_for_intro(const rend_intro_cell_t *intro, } goto err; - } else { - need_free = 1; } } else if (intro->version == 2) { - rp = intro->u.v2.extend_info; + rp = extend_info_dup(intro->u.v2.extend_info); } else if (intro->version == 3) { - rp = intro->u.v3.extend_info; + rp = extend_info_dup(intro->u.v3.extend_info); } else { if (err_msg_out) { tor_asprintf(&err_msg, @@ -1836,8 +1825,6 @@ find_rp_for_intro(const rend_intro_cell_t *intro, else tor_free(err_msg); done: - if (rp && need_free_out) *need_free_out = need_free; - return rp; } |