summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiampaolo RodolĂ  <g.rodola@gmail.com>2010-08-23 22:34:37 (GMT)
committerGiampaolo RodolĂ  <g.rodola@gmail.com>2010-08-23 22:34:37 (GMT)
commited2ce469f3bf4a0f6fb20761659ce6f5f2f3b399 (patch)
tree2b7a7ee0484c2176f45a6140366dd099bf2b25ba
parent3fac43f89fb08487dc48fffa791d1c205d9710c5 (diff)
downloadcpython-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-xLib/smtpd.py25
-rw-r--r--Misc/NEWS3
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)
diff --git a/Misc/NEWS b/Misc/NEWS
index b94623d..4c2ebe4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.