]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
alice just fetched bob's hidden webpage.
authorRoger Dingledine <arma@torproject.org>
Tue, 6 Apr 2004 21:52:01 +0000 (21:52 +0000)
committerRoger Dingledine <arma@torproject.org>
Tue, 6 Apr 2004 21:52:01 +0000 (21:52 +0000)
yay.

svn:r1512

src/or/circuit.c
src/or/connection_edge.c
src/or/or.h

index 89b728f8b2ae9b6a0d0b99eea3abdca9710e8430..78ef57d6363cf4cca13b322477d49fd443721254 100644 (file)
@@ -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 */
 }
index d98cde62d2fd58fd4d342b484a86fb3e9894fd4c..dd5e8ebfddb5d4a095ea32aa75e0553015f9b9b5 100644 (file)
@@ -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;
index 6ddd2587cf15c0553376955985407927e49a76fa..d2aaf75d893c396f8e406a998e66dc03132eb6f1 100644 (file)
@@ -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);