fix #10340: properly handle EINVAL on OSX and also avoid to call handle_connect() in case of a disconnetected socket which is not meant to connect.

This commit is contained in:
Giampaolo Rodola' 2012-03-22 16:17:43 +01:00
parent 9faf5ee750
commit 350c94b900
2 changed files with 25 additions and 8 deletions

View file

@ -225,6 +225,7 @@ class dispatcher:
debug = False
connected = False
accepting = False
connecting = False
closing = False
addr = None
ignore_log_types = frozenset(['warning'])
@ -248,7 +249,7 @@ class dispatcher:
try:
self.addr = sock.getpeername()
except socket.error as err:
if err.args[0] == ENOTCONN:
if err.args[0] in (ENOTCONN, EINVAL):
# To handle the case where we got an unconnected
# socket.
self.connected = False
@ -342,6 +343,7 @@ class dispatcher:
def connect(self, address):
self.connected = False
self.connecting = True
err = self.socket.connect_ex(address)
if err in (EINPROGRESS, EALREADY, EWOULDBLOCK) \
or err == EINVAL and os.name in ('nt', 'ce'):
@ -401,6 +403,7 @@ class dispatcher:
def close(self):
self.connected = False
self.accepting = False
self.connecting = False
self.del_channel()
try:
self.socket.close()
@ -439,7 +442,8 @@ class dispatcher:
# sockets that are connected
self.handle_accept()
elif not self.connected:
self.handle_connect_event()
if self.connecting:
self.handle_connect_event()
self.handle_read()
else:
self.handle_read()
@ -450,6 +454,7 @@ class dispatcher:
raise socket.error(err, _strerror(err))
self.handle_connect()
self.connected = True
self.connecting = False
def handle_write_event(self):
if self.accepting:
@ -458,12 +463,8 @@ class dispatcher:
return
if not self.connected:
#check for errors
err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
if err != 0:
raise socket.error(err, _strerror(err))
self.handle_connect_event()
if self.connecting:
self.handle_connect_event()
self.handle_write()
def handle_expt_event(self):