|  | @@ -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;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |