commit 2e86567b0cbcae03ddf1bec335808cd51329c961 Author: Damian Johnson atagar@torproject.org Date: Wed Jan 23 11:50:49 2019 -0800
Catch ORPort socket timeouts
Oops. I added a timeout attribute but completely forgot to catch the resulting exceptions. Caught thanks to starlight...
https://trac.torproject.org/projects/tor/ticket/28961
Traceback (most recent call last): File "../download_descriptor.py", line 133, in <module> main() File "../download_descriptor.py", line 115, in main endpoints = [args.download_from], File "/usr/local/lib/python3.7/site-packages/stem/descriptor/remote.py", line 485, in run return list(self._run(suppress)) File "/usr/local/lib/python3.7/site-packages/stem/descriptor/remote.py", line 496, in _run raise self.error File "/usr/local/lib/python3.7/site-packages/stem/descriptor/remote.py", line 561, in _download_descriptors self.content, self.reply_headers = _download_from_orport(endpoint, self.compression, self.resource) File "/usr/local/lib/python3.7/site-packages/stem/descriptor/remote.py", line 962, in _download_from_orport with relay.create_circuit() as circ: File "/usr/local/lib/python3.7/site-packages/stem/client/__init__.py", line 207, in create_circuit for cell in self._msg(create_fast_cell): File "/usr/local/lib/python3.7/site-packages/stem/client/__init__.py", line 160, in _msg response = self._orport.recv(timeout = 1) File "/usr/local/lib/python3.7/site-packages/stem/socket.py", line 416, in recv return self._recv(wrapped_recv) File "/usr/local/lib/python3.7/site-packages/stem/socket.py", line 274, in _recv return handler(my_socket, my_socket_file) File "/usr/local/lib/python3.7/site-packages/stem/socket.py", line 410, in wrapped_recv return s.recv() File "/usr/local/lib/python3.7/ssl.py", line 1037, in recv return self.read(buflen) File "/usr/local/lib/python3.7/ssl.py", line 913, in read return self._sslobj.read(len) socket.timeout: The read operation timed out
Through experimentation I also managed to get the following too...
Traceback (most recent call last): File "download_descriptor.py", line 131, in <module> main() File "download_descriptor.py", line 113, in main endpoints = [args.download_from], File "/home/atagar/Desktop/stem/stem/descriptor/remote.py", line 485, in run return list(self._run(suppress)) File "/home/atagar/Desktop/stem/stem/descriptor/remote.py", line 496, in _run raise self.error ssl.SSLError: ('The read operation timed out',)
Unfortunately since this is an SSL socket (rather than a standard one) receive calls are liable to raise exceptions from both modules making this a bit of a whack-a-mole game (socket's docs are particularly bad about describing the array of exceptions that might get raised). --- stem/socket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/stem/socket.py b/stem/socket.py index 9290d6c6..80d29b83 100644 --- a/stem/socket.py +++ b/stem/socket.py @@ -408,7 +408,7 @@ class RelaySocket(BaseSocket):
try: return s.recv() - except ssl.SSLWantReadError: + except (socket.timeout, ssl.SSLError, ssl.SSLWantReadError): return None finally: s.setblocking(1)
tor-commits@lists.torproject.org