Kaydet (Commit) 638d40b4 authored tarafından R David Murray's avatar R David Murray

#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.
üst f2b34b8b
...@@ -391,6 +391,8 @@ class BytesGenerator(Generator): ...@@ -391,6 +391,8 @@ class BytesGenerator(Generator):
if msg._payload is None: if msg._payload is None:
return return
if _has_surrogates(msg._payload): if _has_surrogates(msg._payload):
if self._mangle_from_:
msg._payload = fcre.sub(">From ", msg._payload)
self.write(msg._payload) self.write(msg._payload)
else: else:
super(BytesGenerator,self)._handle_text(msg) super(BytesGenerator,self)._handle_text(msg)
......
...@@ -20,7 +20,7 @@ import email ...@@ -20,7 +20,7 @@ import email
from email.charset import Charset from email.charset import Charset
from email.header import Header, decode_header, make_header from email.header import Header, decode_header, make_header
from email.parser import Parser, HeaderParser 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.message import Message
from email.mime.application import MIMEApplication from email.mime.application import MIMEApplication
from email.mime.audio import MIMEAudio from email.mime.audio import MIMEAudio
...@@ -1298,6 +1298,20 @@ Blah blah blah ...@@ -1298,6 +1298,20 @@ Blah blah blah
self.assertEqual(len([1 for x in s.getvalue().split('\n') self.assertEqual(len([1 for x in s.getvalue().split('\n')
if x.startswith('>From ')]), 2) 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 # Test the basic MIMEAudio class
class TestMIMEAudio(unittest.TestCase): class TestMIMEAudio(unittest.TestCase):
......
...@@ -915,6 +915,7 @@ Ken Stox ...@@ -915,6 +915,7 @@ Ken Stox
Dan Stromberg Dan Stromberg
Daniel Stutzbach Daniel Stutzbach
Andreas Stührk Andreas Stührk
Colin Su
Pal Subbiah Pal Subbiah
Nathan Sullivan Nathan Sullivan
Mark Summerfield Mark Summerfield
......
...@@ -109,6 +109,9 @@ Core and Builtins ...@@ -109,6 +109,9 @@ Core and Builtins
Library 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 #15777: Fix a refleak in _posixsubprocess.
- Issue #15199: Fix JavaScript's default MIME type to application/javascript. - Issue #15199: Fix JavaScript's default MIME type to application/javascript.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment