]> granicus.if.org Git - python/commitdiff
backporting security fix of issue 9129 (smtpd module vulnerable to DoS attacks in...
authorGiampaolo Rodolà <g.rodola@gmail.com>
Tue, 7 Dec 2010 18:54:43 +0000 (18:54 +0000)
committerGiampaolo Rodolà <g.rodola@gmail.com>
Tue, 7 Dec 2010 18:54:43 +0000 (18:54 +0000)
Lib/smtpd.py
Misc/NEWS

index c3bd6a5addad35337be7323b10c5bffd61756829..94bd8e6867f4daeb4a376ea254fe5bad656583ca 100755 (executable)
@@ -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 >> 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 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 >> DEBUGSTREAM, 'Incoming connection from %s' % repr(addr)
         channel = SMTPChannel(self, conn, addr)
 
index 550091cc7538c8a079a0bdd3d7326f3fd5a05293..449348ef6f6120f32f68243cad7f0c9d6643e127 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -19,6 +19,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #9129: smtpd.py is vulnerable to DoS attacks deriving from missing
+  error handling when accepting a new connection.
 
 What's New in Python 2.6.6?
 ===========================
@@ -206,7 +208,7 @@ Library
 - Issue #8620: when a Cmd is fed input that reaches EOF without a final
   newline, it no longer truncates the last character of the last command line.
 
-- Issue #7066: archive_util.make_archive now restores the cwd if an error is 
+- Issue #7066: archive_util.make_archive now restores the cwd if an error is
   raised. Initial patch by Ezio Melotti.
 
 - Issue #5006: Better handling of unicode byte-order marks (BOM) in the io