diff options
author | Mark Heiges <mheiges@ibm.com> | 2020-05-09 15:21:30 -0400 |
---|---|---|
committer | Brian May <brian@linuxpenguins.xyz> | 2020-05-10 14:20:38 +1000 |
commit | 534ad8dfed8b803165b15157eea9d85e30924a59 (patch) | |
tree | 41040183c88db068c04184c2bffaba4dce34c0dd | |
parent | 535eb6292886c5ce14a283c217962f94427c8a89 (diff) |
fix crash triggered by port scans closing socket
-rw-r--r-- | sshuttle/methods/pf.py | 10 | ||||
-rw-r--r-- | 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 |