]> granicus.if.org Git - python/commitdiff
Patch by Per Cederqvist, who writes:
authorGuido van Rossum <guido@python.org>
Mon, 29 Mar 1999 20:33:21 +0000 (20:33 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 29 Mar 1999 20:33:21 +0000 (20:33 +0000)
"""
 - It needlessly used the makefile() method for each response that is
   read from the SMTP server.

 - If the remote SMTP server closes the connection unexpectedly the
   code raised an IndexError.  It now raises an SMTPServerDisconnected
   exception instead.

 - The code now checks that all lines in a multiline response actually
   contains an error code.
"""

The Dragon approves.

Lib/smtplib.py

index 47e1fafbb3d9570f12b6a8d4acfe20a249605248..bd221dc4e936415996362b22c150dae9461f0cd9 100755 (executable)
@@ -187,21 +187,30 @@ class SMTP:
 
           - server response string corresponding to response code (multiline
             responses are converted to a single, multiline string).
+
+        Raises SMTPServerDisconnected if end-of-file is reached.
         """
         resp=[]
-        self.file = self.sock.makefile('rb')
+       if self.file is None:
+           self.file = self.sock.makefile('rb')
         while 1:
             line = self.file.readline()
+           if line == '':
+               self.close()
+               raise SMTPServerDisconnected("Connection unexpectedly closed")
             if self.debuglevel > 0: print 'reply:', `line`
             resp.append(string.strip(line[4:]))
             code=line[:3]
-            #check if multiline resp
+           # Check that the error code is syntactically correct.
+           # Don't attempt to read a continuation line if it is broken.
+           try:
+               errcode = string.atoi(code)
+           except ValueError:
+               errcode = -1
+               break
+            # Check if multiline response.
             if line[3:4]!="-":
                 break
-        try:
-            errcode = string.atoi(code)
-        except(ValueError):
-            errcode = -1
 
         errmsg = string.join(resp,"\n")
         if self.debuglevel > 0: