[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-bugs] #14334 [Tor]: Bugs when registering guard status in connection_or_connect()



#14334: Bugs when registering guard status in connection_or_connect()
-----------------------+------------------------------------
 Reporter:  asn        |          Owner:
     Type:  defect     |         Status:  new
 Priority:  normal     |      Milestone:  Tor: 0.2.6.x-final
Component:  Tor        |        Version:
 Keywords:  tor-guard  |  Actual Points:
Parent ID:             |         Points:
-----------------------+------------------------------------
 In `connection_or_connect()` we can see the following snippet:
 {{{
   switch (connection_connect(TO_CONN(conn), conn->base_.address,
                              &addr, port, &socket_error)) {
     case -1:
       /* If the connection failed immediately, and we're using
        * a proxy, our proxy is down. Don't blame the Tor server. */
       if (conn->base_.proxy_state == PROXY_INFANT)
         entry_guard_register_connect_status(conn->identity_digest,
                                             0, 1, time(NULL));
       connection_or_connect_failed(conn,
 errno_to_orconn_end_reason(socket_error),
                                    tor_socket_strerror(socket_error));
       connection_free(TO_CONN(conn));
       return NULL;
 }}}

 I see two problems here:

 a) `connection_or_connect()` can fail in ways that are unrelated to the
 guard node. For example it can fail with this codepath, in which case the
 guard should not be marked as down:
 {{{
   s =
 tor_open_socket_nonblocking(protocol_family,SOCK_STREAM,IPPROTO_TCP);
   if (! SOCKET_OK(s)) {
     *socket_error = tor_socket_errno(-1);
     log_warn(LD_NET,"Error creating network socket: %s",
              tor_socket_strerror(*socket_error));
     return -1;
   }
 }}}

 b) Also, he comment seems to state the opposite than what the code does.
 That is, the comment claims that if we are using a proxy and it's down, we
 shouldn't mark the guard as down. But the code only marks the guard as
 down, if the proxy state is `PROXY_INFANT` which is the state of a proxy
 when we haven't connected to it yet. I think the bug was introduced by me
 in `a79bea40d`.

 I think a better solution here is to check for `proxy_type == PROXY_NONE`
 before marking the guard as down.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/14334>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online
_______________________________________________
tor-bugs mailing list
tor-bugs@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-bugs