Commit 1e949890 authored by R David Murray's avatar R David Murray

#17369: Improve handling of broken RFC2231 values in get_filename.

This fixes a regression relative to python2.
parent bd3a11ba
...@@ -337,6 +337,10 @@ def collapse_rfc2231_value(value, errors='replace', ...@@ -337,6 +337,10 @@ def collapse_rfc2231_value(value, errors='replace',
# object. We do not want bytes() normal utf-8 decoder, we want a straight # object. We do not want bytes() normal utf-8 decoder, we want a straight
# interpretation of the string as character bytes. # interpretation of the string as character bytes.
charset, language, text = value charset, language, text = value
if charset is None:
# Issue 17369: if charset/lang is None, decode_rfc2231 couldn't parse
# the value, so use the fallback_charset.
charset = fallback_charset
rawbytes = bytes(text, 'raw-unicode-escape') rawbytes = bytes(text, 'raw-unicode-escape')
try: try:
return str(rawbytes, charset, errors) return str(rawbytes, charset, errors)
......
...@@ -5018,6 +5018,26 @@ Content-Type: application/x-foo; name*0=\"Frank's\"; name*1=\" Document\" ...@@ -5018,6 +5018,26 @@ Content-Type: application/x-foo; name*0=\"Frank's\"; name*1=\" Document\"
self.assertNotIsInstance(param, tuple) self.assertNotIsInstance(param, tuple)
self.assertEqual(param, "Frank's Document") self.assertEqual(param, "Frank's Document")
def test_rfc2231_missing_tick(self):
m = '''\
Content-Disposition: inline;
\tfilename*0*="'This%20is%20broken";
'''
msg = email.message_from_string(m)
self.assertEqual(
msg.get_filename(),
"'This is broken")
def test_rfc2231_missing_tick_with_encoded_non_ascii(self):
m = '''\
Content-Disposition: inline;
\tfilename*0*="'This%20is%E2broken";
'''
msg = email.message_from_string(m)
self.assertEqual(
msg.get_filename(),
"'This is\ufffdbroken")
# test_headerregistry.TestContentTypeHeader.rfc2231_single_quote_in_value_with_charset_and_lang # test_headerregistry.TestContentTypeHeader.rfc2231_single_quote_in_value_with_charset_and_lang
def test_rfc2231_tick_attack_extended(self): def test_rfc2231_tick_attack_extended(self):
eq = self.assertEqual eq = self.assertEqual
......
...@@ -45,6 +45,10 @@ Core and Builtins ...@@ -45,6 +45,10 @@ Core and Builtins
Library Library
------- -------
- Issue #17369: get_filename was raising an exception if the filename
parameter's RFC2231 encoding was broken in certain ways. This was
a regression relative to python2.
- Issue #20013: Some imap servers disconnect if the current mailbox is - Issue #20013: Some imap servers disconnect if the current mailbox is
deleted, and imaplib did not handle that case gracefully. Now it deleted, and imaplib did not handle that case gracefully. Now it
handles the 'bye' correctly. handles the 'bye' correctly.
......
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