summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Heiges <mheiges@ibm.com>2020-05-09 15:21:30 -0400
committerBrian May <brian@linuxpenguins.xyz>2020-05-10 14:20:38 +1000
commit534ad8dfed8b803165b15157eea9d85e30924a59 (patch)
tree41040183c88db068c04184c2bffaba4dce34c0dd
parent535eb6292886c5ce14a283c217962f94427c8a89 (diff)
fix crash triggered by port scans closing socket
-rw-r--r--sshuttle/methods/pf.py10
-rw-r--r--sshuttle/ssnet.py5
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