fix issue 9129: adds proper error handling on accept() when smtpd accepts new incoming connections.

This commit is contained in:
Giampaolo Rodolà 2010-08-23 22:28:13 +00:00
parent bbc4782d77
commit 9cf5ef4cc0
2 changed files with 26 additions and 2 deletions

View File

@ -121,7 +121,15 @@ class SMTPChannel(asynchat.async_chat):
self.rcpttos = []
self.received_data = ''
self.fqdn = socket.getfqdn()
try:
self.peer = conn.getpeername()
except socket.error as err:
# a race condition may occur if the other end is closing
# before we can get the peername
self.close()
if err.args[0] != errno.ENOTCONN:
raise
return
print('Peer:', repr(self.peer), file=DEBUGSTREAM)
self.push('220 %s %s' % (self.fqdn, __version__))
self.set_terminator(b'\r\n')
@ -414,7 +422,20 @@ class SMTPServer(asyncore.dispatcher):
localaddr, remoteaddr), file=DEBUGSTREAM)
def handle_accept(self):
try:
conn, addr = self.accept()
except TypeError:
# sometimes accept() might return None
return
except socket.error as err:
# ECONNABORTED might be thrown
if err.args[0] != errno.ECONNABORTED:
raise
return
else:
# sometimes addr == None instead of (ip, port)
if addr == None:
return
print('Incoming connection from %s' % repr(addr), file=DEBUGSTREAM)
channel = self.channel_class(self, conn, addr)

View File

@ -123,6 +123,9 @@ Extensions
Library
-------
- Issue #9129: smtpd.py is vulnerable to DoS attacks deriving from missing
error handling when accepting a new connection.
- Issue #9601: ftplib now provides a workaround for non-compliant
implementations such as IIS shipped with Windows server 2003 returning invalid
response codes for MKD and PWD commands.