From f123f84f66bded5a5554f7130cf823d53d3304cd Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 29 Mar 1999 20:33:21 +0000 Subject: Patch by Per Cederqvist, who writes: """ - 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 | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'Lib/smtplib.py') diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 47e1fafbb3..bd221dc4e9 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -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: -- cgit v1.2.1