diff --git a/src/or/circuit.c b/src/or/circuit.c index 89b728f8b2..78ef57d636 100644 --- a/src/or/circuit.c +++ b/src/or/circuit.c @@ -737,17 +737,23 @@ relay_lookup_conn(circuit_t *circ, cell_t *cell, int cell_direction) if(!rh.stream_id) return NULL; - if(cell_direction == CELL_DIRECTION_OUT) - tmpconn = circ->n_streams; - else - tmpconn = circ->p_streams; + /* IN or OUT cells could have come from either direction, now + * that we allow rendezvous *to* an OP. + */ - for( ; tmpconn; tmpconn=tmpconn->next_stream) { + for(tmpconn = circ->n_streams; tmpconn; tmpconn=tmpconn->next_stream) { + if(rh.stream_id == tmpconn->stream_id) { + log_fn(LOG_DEBUG,"found conn for stream %d.", rh.stream_id); + if(cell_direction == CELL_DIRECTION_OUT || + connection_edge_is_rendezvous_stream(tmpconn)) + return tmpconn; + } + } + for(tmpconn = circ->p_streams; tmpconn; tmpconn=tmpconn->next_stream) { if(rh.stream_id == tmpconn->stream_id) { log_fn(LOG_DEBUG,"found conn for stream %d.", rh.stream_id); return tmpconn; } -// log_fn(LOG_DEBUG,"considered stream %d, not it.",tmpconn->stream_id); } return NULL; /* probably a begin relay cell */ } diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index d98cde62d2..dd5e8ebfdd 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -482,7 +482,7 @@ int connection_edge_finished_flushing(connection_t *conn) { if(connection_wants_to_flush(conn)) /* in case there are any queued relay cells */ connection_start_writing(conn); /* deliver a 'connected' relay cell back through the circuit. */ - if(*conn->rend_query) { /* rendezvous stream */ + if(connection_edge_is_rendezvous_stream(conn)) { if(connection_edge_send_command(conn, circuit_get_by_conn(conn), RELAY_COMMAND_CONNECTED, NULL, 0, conn->cpath_layer) < 0) return 0; /* circuit is closed, don't continue */ @@ -775,7 +775,7 @@ circuit_get_open_circ_or_launch(connection_t *conn, return 1; /* we're happy */ } - if(!*conn->rend_query) { /* general purpose circ */ + if(!connection_edge_is_rendezvous_stream(conn)) { /* general purpose circ */ addr = client_dns_lookup_entry(conn->socks_request->address); if(router_exit_policy_all_routers_reject(addr, conn->socks_request->port)) { log_fn(LOG_WARN,"No Tor server exists that allows exit to %s:%d. Rejecting.", @@ -853,7 +853,7 @@ int connection_ap_handshake_attach_circuit(connection_t *conn) { assert(conn->state == AP_CONN_STATE_CIRCUIT_WAIT); assert(conn->socks_request); - if(!*conn->rend_query) { /* we're a general conn */ + if(!connection_edge_is_rendezvous_stream(conn)) { /* we're a general conn */ circuit_t *circ=NULL; /* find the circuit that we should use, if there is one. */ @@ -1168,7 +1168,7 @@ static int connection_exit_begin_conn(cell_t *cell, circuit_t *circ) { void connection_exit_connect(connection_t *conn) { unsigned char connected_payload[4]; - if (!*conn->rend_query && + if (!connection_edge_is_rendezvous_stream(conn) && router_compare_to_my_exit_policy(conn) == ADDR_POLICY_REJECTED) { log_fn(LOG_INFO,"%s:%d failed exit policy. Closing.", conn->address, conn->port); connection_mark_for_close(conn, END_STREAM_REASON_EXITPOLICY); @@ -1200,7 +1200,7 @@ void connection_exit_connect(connection_t *conn) { connection_watch_events(conn, POLLIN); /* also, deliver a 'connected' cell back through the circuit. */ - if(*conn->rend_query) { /* rendezvous stream */ + if(connection_edge_is_rendezvous_stream(conn)) { /* rendezvous stream */ /* don't send an address back! */ connection_edge_send_command(conn, circuit_get_by_conn(conn), RELAY_COMMAND_CONNECTED, NULL, 0, conn->cpath_layer); @@ -1225,6 +1225,13 @@ connection_exit_set_rendezvous_addr_port(connection_t *conn) { return 0; } +int connection_edge_is_rendezvous_stream(connection_t *conn) { + assert(conn); + if(*conn->rend_query) /* XXX */ + return 1; + return 0; +} + int connection_ap_can_use_exit(connection_t *conn, routerinfo_t *exit) { uint32_t addr; diff --git a/src/or/or.h b/src/or/or.h index 6ddd2587cf..d2aaf75d89 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -858,6 +858,7 @@ void connection_ap_handshake_socks_reply(connection_t *conn, char *reply, int replylen, char success); void connection_exit_connect(connection_t *conn); +int connection_edge_is_rendezvous_stream(connection_t *conn); int connection_ap_can_use_exit(connection_t *conn, routerinfo_t *exit); void connection_ap_expire_beginning(void); void connection_ap_attach_pending(void);