From 45e0e1444bfaa3d57b6adf3bd2a7ec9171407792 Mon Sep 17 00:00:00 2001 From: "R. David Murray" Date: Wed, 16 Jun 2010 02:19:40 +0000 Subject: Merged revisions 81675 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r81675 | r.david.murray | 2010-06-03 11:43:20 -0400 (Thu, 03 Jun 2010) | 10 lines #5610: use \Z not $ so we don't eat extra chars when body part ends with \r\n. If a body part ended with \r\n, feedparser, using '$' to terminate its search for the newline, would match on the \r\n, and think that it needed to strip two characters in order to account for the line end before the boundary. That made it chop one too many characters off the end of the body part. Using \Z makes the match correct. Patch and test by Tony Nelson. ........ --- Lib/email/feedparser.py | 2 +- Lib/email/test/test_email.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py index bff17ba..a6853c2 100644 --- a/Lib/email/feedparser.py +++ b/Lib/email/feedparser.py @@ -28,7 +28,7 @@ from email import message NLCRE = re.compile('\r\n|\r|\n') NLCRE_bol = re.compile('(\r\n|\r|\n)') -NLCRE_eol = re.compile('(\r\n|\r|\n)$') +NLCRE_eol = re.compile('(\r\n|\r|\n)\Z') NLCRE_crack = re.compile('(\r\n|\r|\n)') # RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character # except controls, SP, and ":". diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 79146a3..be0565e 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2588,6 +2588,24 @@ Here's the message body eq(headers, ['A', 'B', 'CC']) eq(msg.get_payload(), 'body') + def test_CRLFLF_at_end_of_part(self): + # issue 5610: feedparser should not eat two chars from body part ending + # with "\r\n\n". + m = ( + "From: foo@bar.com\n" + "To: baz\n" + "Mime-Version: 1.0\n" + "Content-Type: multipart/mixed; boundary=BOUNDARY\n" + "\n" + "--BOUNDARY\n" + "Content-Type: text/plain\n" + "\n" + "body ending with CRLF newline\r\n" + "\n" + "--BOUNDARY--\n" + ) + msg = email.message_from_string(m) + self.assertTrue(msg.get_payload(0).get_payload().endswith('\r\n')) class TestBase64(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index f41096a..7817276 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -432,6 +432,9 @@ C-API Library ------- +- Issue #5610: feedparser no longer eats extra characters at the end of + a body part if the body part ends with a \r\n. + - Issue #8986: math.erfc was incorrectly raising OverflowError for values between -27.3 and -30.0 on some platforms. -- cgit v0.12