Commit 9cf5ef4c authored by Giampaolo Rodolà's avatar Giampaolo Rodolà

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

parent bbc4782d
...@@ -121,7 +121,15 @@ class SMTPChannel(asynchat.async_chat): ...@@ -121,7 +121,15 @@ class SMTPChannel(asynchat.async_chat):
self.rcpttos = [] self.rcpttos = []
self.received_data = '' self.received_data = ''
self.fqdn = socket.getfqdn() self.fqdn = socket.getfqdn()
self.peer = conn.getpeername() 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) print('Peer:', repr(self.peer), file=DEBUGSTREAM)
self.push('220 %s %s' % (self.fqdn, __version__)) self.push('220 %s %s' % (self.fqdn, __version__))
self.set_terminator(b'\r\n') self.set_terminator(b'\r\n')
...@@ -414,7 +422,20 @@ class SMTPServer(asyncore.dispatcher): ...@@ -414,7 +422,20 @@ class SMTPServer(asyncore.dispatcher):
localaddr, remoteaddr), file=DEBUGSTREAM) localaddr, remoteaddr), file=DEBUGSTREAM)
def handle_accept(self): def handle_accept(self):
conn, addr = self.accept() 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) print('Incoming connection from %s' % repr(addr), file=DEBUGSTREAM)
channel = self.channel_class(self, conn, addr) channel = self.channel_class(self, conn, addr)
......
...@@ -123,6 +123,9 @@ Extensions ...@@ -123,6 +123,9 @@ Extensions
Library 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 - Issue #9601: ftplib now provides a workaround for non-compliant
implementations such as IIS shipped with Windows server 2003 returning invalid implementations such as IIS shipped with Windows server 2003 returning invalid
response codes for MKD and PWD commands. response codes for MKD and PWD commands.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment