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

[tor-commits] [stem/master] Previous socket use could break get_protocolinfo



commit c58177c50fcdba85e5eac7a929dbf6d87c666852
Author: Damian Johnson <atagar@xxxxxxxxxxxxxx>
Date:   Mon Jan 30 00:34:38 2012 -0800

    Previous socket use could break get_protocolinfo
    
    If prior use of the control socket had caused a disconnect and already consumed
    the 'Authentication required.' response then future calls of get_protocolinfo
    would break.
---
 stem/connection.py                    |   17 ++++++++++++-----
 test/integ/connection/protocolinfo.py |   17 +++++++++++++++++
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/stem/connection.py b/stem/connection.py
index 5c1fc55..392ad9b 100644
--- a/stem/connection.py
+++ b/stem/connection.py
@@ -627,16 +627,23 @@ def get_protocolinfo(control_socket):
       socket
   """
   
-  control_socket.send("PROTOCOLINFO 1")
-  protocolinfo_response = control_socket.recv()
+  try:
+    control_socket.send("PROTOCOLINFO 1")
+    protocolinfo_response = control_socket.recv()
+  except:
+    protocolinfo_response = None
   
   # Tor hangs up on sockets after receiving a PROTOCOLINFO query if it isn't
   # next followed by authentication. Transparently reconnect if that happens.
   
-  if str(protocolinfo_response) == "Authentication required.":
+  if not protocolinfo_response or str(protocolinfo_response) == "Authentication required.":
     control_socket.connect()
-    control_socket.send("PROTOCOLINFO 1")
-    protocolinfo_response = control_socket.recv()
+    
+    try:
+      control_socket.send("PROTOCOLINFO 1")
+      protocolinfo_response = control_socket.recv()
+    except stem.socket.SocketClosed, exc:
+      raise stem.socket.SocketError(exc)
   
   ProtocolInfoResponse.convert(protocolinfo_response)
   
diff --git a/test/integ/connection/protocolinfo.py b/test/integ/connection/protocolinfo.py
index e0e8805..a0214a2 100644
--- a/test/integ/connection/protocolinfo.py
+++ b/test/integ/connection/protocolinfo.py
@@ -91,6 +91,23 @@ class TestProtocolInfo(unittest.TestCase):
         protocolinfo_response = stem.connection.get_protocolinfo(control_socket)
         self.assert_matches_test_config(protocolinfo_response)
   
+  def test_pre_disconnected_query(self):
+    """
+    Tests making a PROTOCOLINFO query when previous use of the socket had
+    already disconnected it.
+    """
+    
+    with test.runner.get_runner().get_tor_socket(False) as control_socket:
+      # makes a couple protocolinfo queries outside of get_protocolinfo first
+      control_socket.send("PROTOCOLINFO 1")
+      control_socket.recv()
+      
+      control_socket.send("PROTOCOLINFO 1")
+      control_socket.recv()
+      
+      protocolinfo_response = stem.connection.get_protocolinfo(control_socket)
+      self.assert_matches_test_config(protocolinfo_response)
+  
   def assert_matches_test_config(self, protocolinfo_response):
     """
     Makes assertions that the protocolinfo response's attributes match those of



_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits