diff options
author | Giampaolo RodolĂ <g.rodola@gmail.com> | 2010-08-23 22:34:37 (GMT) |
---|---|---|
committer | Giampaolo RodolĂ <g.rodola@gmail.com> | 2010-08-23 22:34:37 (GMT) |
commit | ed2ce469f3bf4a0f6fb20761659ce6f5f2f3b399 (patch) | |
tree | 2b7a7ee0484c2176f45a6140366dd099bf2b25ba | |
parent | 3fac43f89fb08487dc48fffa791d1c205d9710c5 (diff) | |
download | cpython-ed2ce469f3bf4a0f6fb20761659ce6f5f2f3b399.zip cpython-ed2ce469f3bf4a0f6fb20761659ce6f5f2f3b399.tar.gz cpython-ed2ce469f3bf4a0f6fb20761659ce6f5f2f3b399.tar.bz2 |
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.
........
-rwxr-xr-x | Lib/smtpd.py | 25 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
2 files changed, 26 insertions, 2 deletions
diff --git a/Lib/smtpd.py b/Lib/smtpd.py index 76df673..57ad089 100755 --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -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 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') @@ -289,7 +297,20 @@ class SMTPServer(asyncore.dispatcher): localaddr, remoteaddr), file=DEBUGSTREAM) 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) channel = SMTPChannel(self, conn, addr) @@ -95,6 +95,9 @@ C-API 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. |