[tor-commits] [ooni-probe/master] In connectionFailed, handle an error from makeConnection() where on some

art at torproject.org art at torproject.org
Tue Apr 30 13:01:43 UTC 2013


commit 5cd30dababdf6f61187de215e2440a1917388007
Author: Isis Lovecruft <isis at torproject.org>
Date:   Thu Feb 28 04:12:02 2013 +0000

    In connectionFailed, handle an error from makeConnection() where on some
    systems, /dev/random is apparently set to 0600 root:root, and also add
    handling for propagating errors due to the network/server being unreachable.
---
 nettests/experimental/tls_handshake.py |   72 ++++++++++++++++++++++++++------
 1 files changed, 59 insertions(+), 13 deletions(-)

diff --git a/nettests/experimental/tls_handshake.py b/nettests/experimental/tls_handshake.py
index 322ec72..d84f174 100644
--- a/nettests/experimental/tls_handshake.py
+++ b/nettests/experimental/tls_handshake.py
@@ -209,20 +209,66 @@ class TLSHandshakeTest(nettest.NetTestCase):
             connection.connect(host)
             return connection
 
-            connection = SSL.Connection(context, socket)
+        def connectionFailed(connection, host):
+            """
+            Handle errors raised while attempting to create the socket, TLS/SSL
+            context, and :class:`OpenSSL.SSL.Connection` object.
 
-            try:
-                connection.connect((addr, port))
-            except serror, se:
-                if se.message.find("[Errno 101]"):
-                    connection.shutdown()
-                log.err(se)
+            @param connection: The Exception that was raised in
+                               :func:`makeConnection`.
+            @param host: A tuple of the host IP address as a string, and an int
+                         specifying the host port, i.e. ('1.1.1.1', 443)
+            """
+            addr, port = host
+            if isinstance(connection, IOError):
+                ## On some *nix distros, /dev/random is 0600 root:root and we get
+                ## a permissions error when trying to read
+                if connection.message.find("[Errno 13]"):
+                    raise NotRootError(
+                        "%s" % connection.message.split("[Errno 13]", 1)[1])
+
+            if isinstance(connection, socket_error):
+                if connection.message.find("[Errno 101]"):
+                    raise HostUnreachableError(
+                        "Host unreachable: %s:%s" % (addr, port))
+
+            log.err(connection)
+            self.report['host'] = addr
+            self.report['port'] = port
+            self.report['state'] = 'CONNECTION_FAILED'
+            return connection
+
+        def connectionSucceeded(connection, host, timeout):
+            """
+            If we have created a connection, set the socket options, and log the
+            connection state and peer name.
+
+            @param connection: A :class:`OpenSSL.SSL.Connection` object.
+            @param host: A tuple of the host IP and port, i.e. ('1.1.1.1', 443).
+            """
+            connection.setblocking(1)
+            ## Set the timeout on the connection:
+            ##
+            ## We want to set SO_RCVTIMEO and SO_SNDTIMEO, which both are
+            ## defined in the socket option definitions in <sys/socket.h>, and
+            ## which both take as their value, according to socket(7), a
+            ## struct timeval, which is defined in the libc manual:
+            ## https://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.html
+            timeval = struct.pack('ll', int(timeout), 0)
+            connection.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, timeval)
+            connection.setsockopt(socket.SOL_SOCKET, socket.SO_SNDTIMEO, timeval)
+
+            ## Set the connection state to client mode:
+            connection.set_connect_state()
+
+            peer_name, peer_port = connection.getpeername()
+            if peer_name:
+                log.msg("Connected to %s" % peer_name)
             else:
-                connection.setblocking(1)
-                connection.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO,
-                                      self.timeout)
-                log.msg("Connected to %s" % connection.getpeername())
-                log.msg("Connection state: %s " % connection.state_string())
+                log.debug("Couldn't get peer name from connection: %s" % host)
+                log.msg("Connected to: %s" % host)
+            log.msg("Connection state: %s " % connection.state_string())
+
             return connection
 
         def doHandshake(connection):





More information about the tor-commits mailing list