From: R David Murray <rdmurray@bitdance.com> Date: Fri, 24 Aug 2012 15:14:13 +0000 (-0400) Subject: #15249: Mangle From lines correctly when body contains invalid bytes. X-Git-Tag: v3.3.0rc1~19^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=638d40b4337808f5e7c3f415f49270185c893321;p=python #15249: Mangle From lines correctly when body contains invalid bytes. Fix by Colin Su. Test by me, based on a test written by Petri Lehtinen. --- diff --git a/Lib/email/generator.py b/Lib/email/generator.py index 02487e3082..c6bfb704f5 100644 --- a/Lib/email/generator.py +++ b/Lib/email/generator.py @@ -391,6 +391,8 @@ class BytesGenerator(Generator): if msg._payload is None: return if _has_surrogates(msg._payload): + if self._mangle_from_: + msg._payload = fcre.sub(">From ", msg._payload) self.write(msg._payload) else: super(BytesGenerator,self)._handle_text(msg) diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 95dc4af7c3..352b9b1d9a 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -20,7 +20,7 @@ import email from email.charset import Charset from email.header import Header, decode_header, make_header from email.parser import Parser, HeaderParser -from email.generator import Generator, DecodedGenerator +from email.generator import Generator, DecodedGenerator, BytesGenerator from email.message import Message from email.mime.application import MIMEApplication from email.mime.audio import MIMEAudio @@ -1298,6 +1298,20 @@ Blah blah blah self.assertEqual(len([1 for x in s.getvalue().split('\n') if x.startswith('>From ')]), 2) + def test_mangled_from_with_bad_bytes(self): + source = textwrap.dedent("""\ + Content-Type: text/plain; charset="utf-8" + MIME-Version: 1.0 + Content-Transfer-Encoding: 8bit + From: aaa@bbb.org + + """).encode('utf-8') + msg = email.message_from_bytes(source + b'From R\xc3\xb6lli\n') + b = BytesIO() + g = BytesGenerator(b, mangle_from_=True) + g.flatten(msg) + self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n') + # Test the basic MIMEAudio class class TestMIMEAudio(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS index 7f223607a9..a46ee843e5 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -915,6 +915,7 @@ Ken Stox Dan Stromberg Daniel Stutzbach Andreas Stührk +Colin Su Pal Subbiah Nathan Sullivan Mark Summerfield diff --git a/Misc/NEWS b/Misc/NEWS index 0d76a6e355..73f058c7b8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -109,6 +109,9 @@ Core and Builtins Library ------- +- Issue #15249: BytesGenerator now correctly mangles From lines (when + requested) even if the body contains undecodable bytes. + - Issue #15777: Fix a refleak in _posixsubprocess. - Issue #15199: Fix JavaScript's default MIME type to application/javascript.