From 534ad8dfed8b803165b15157eea9d85e30924a59 Mon Sep 17 00:00:00 2001 From: Mark Heiges Date: Sat, 9 May 2020 15:21:30 -0400 Subject: fix crash triggered by port scans closing socket --- sshuttle/methods/pf.py | 10 +++++++++- sshuttle/ssnet.py | 5 ++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sshuttle/methods/pf.py b/sshuttle/methods/pf.py index a9d00fa..15a8da4 100644 --- a/sshuttle/methods/pf.py +++ b/sshuttle/methods/pf.py @@ -3,6 +3,7 @@ import sys import platform import re import socket +import errno import struct import subprocess as ssubprocess import shlex @@ -423,7 +424,14 @@ class Method(BaseMethod): def get_tcp_dstip(self, sock): pfile = self.firewall.pfile - peer = sock.getpeername() + try: + peer = sock.getpeername() + except socket.error: + _, e = sys.exc_info()[:2] + if e.args[0] == errno.EINVAL: + debug2("get_tcp_dstip error: sock.getpeername() %s\nsocket is probably closed.\n" % e) + return sock.getsockname() + proxy = sock.getsockname() argv = (sock.family, socket.IPPROTO_TCP, diff --git a/sshuttle/ssnet.py b/sshuttle/ssnet.py index f0e584c..c145233 100644 --- a/sshuttle/ssnet.py +++ b/sshuttle/ssnet.py @@ -96,7 +96,10 @@ def _try_peername(sock): return '%s:%s' % (pn[0], pn[1]) except socket.error: _, e = sys.exc_info()[:2] - if e.args[0] not in (errno.ENOTCONN, errno.ENOTSOCK): + if e.args[0] == errno.EINVAL: + debug2("_try_peername error: sock.getpeername() %s\nsocket is probably closed.\n" % e) + pass + elif e.args[0] not in (errno.ENOTCONN, errno.ENOTSOCK): raise except AttributeError: pass -- cgit v1.2.3