988592dbda
testsuite, so it clearly belongs into stdlib) - fixed smtpd.py DoS (bnc#638233, CVE probably not assigned) OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:Factory/python?expand=0&rev=85
49 lines
1.7 KiB
Diff
49 lines
1.7 KiB
Diff
Index: Lib/smtpd.py
|
|
===================================================================
|
|
--- Lib/smtpd.py.orig
|
|
+++ Lib/smtpd.py
|
|
@@ -121,7 +121,16 @@ 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.connected = False
|
|
+ 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,9 +300,24 @@ 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)
|
|
+ if not channel.connected:
|
|
+ return
|
|
|
|
# API for "doing something useful with the message"
|
|
def process_message(self, peer, mailfrom, rcpttos, data):
|