Merged revisions 84289 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r84289 | giampaolo.rodola | 2010-08-24 00:28:13 +0200 (mar, 24 ago 2010) | 1 line

  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:48:51 +00:00
parent 63308d7c08
commit 8664d74966
2 changed files with 26 additions and 2 deletions

View File

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

View File

@ -31,6 +31,9 @@ Core and Builtins
Library
-------
- Issue #9129: smtpd.py is vulnerable to DoS attacks deriving from missing
error handling when accepting a new connection.
- Issue #658749: asyncore's connect() method now correctly interprets winsock
errors.