diff --git a/src/or/connection.c b/src/or/connection.c index 299d0d2d8e..66046a5a89 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -774,18 +774,20 @@ void connection_write_to_buf(const char *string, int len, connection_t *conn) { } } +/* get the conn to addr/port that has the most recent timestamp_created */ connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) { int i, n; - connection_t *conn; + connection_t *conn, *best=NULL; connection_t **carray; get_connection_array(&carray,&n); for(i=0;iaddr == addr && conn->port == port && !conn->marked_for_close) - return conn; + if(conn->addr == addr && conn->port == port && !conn->marked_for_close && + (!best || best->timestamp_created < conn->timestamp_created)) + best = conn; } - return NULL; + return best; } connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) { diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index 8f6d67a5c7..09b8c1e72c 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -102,16 +102,17 @@ int connection_cpu_process_inbuf(connection_t *conn) { if(p_conn) circ = circuit_get_by_circ_id_conn(circ_id, p_conn); + if(success == 0) { + log_fn(LOG_WARN,"decoding onionskin failed. Closing."); + if(circ) + circuit_mark_for_close(circ); + goto done_processing; + } if(!circ) { log_fn(LOG_INFO,"processed onion for a circ that's gone. Dropping."); goto done_processing; } assert(circ->p_conn); - if(success == 0) { - log_fn(LOG_WARN,"decoding onionskin failed. Closing."); - circuit_mark_for_close(circ); - goto done_processing; - } if(onionskin_answer(circ, buf+TAG_LEN, buf+TAG_LEN+ONIONSKIN_REPLY_LEN) < 0) { log_fn(LOG_WARN,"onionskin_answer failed. Closing."); circuit_mark_for_close(circ);