diff options
-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 |