Commit 65dcc8a8 authored by Andrei Troie's avatar Andrei Troie Committed by Abhilash Raj

bpo-38332: Catch KeyError from unknown cte in encoded-word. (GH-16503)

KeyError should cause a failure in parsing the encoded word and should be caught and raised as a _InvalidEWError instead.
parent 3faf826e
...@@ -1057,7 +1057,7 @@ def get_encoded_word(value): ...@@ -1057,7 +1057,7 @@ def get_encoded_word(value):
value = ''.join(remainder) value = ''.join(remainder)
try: try:
text, charset, lang, defects = _ew.decode('=?' + tok + '?=') text, charset, lang, defects = _ew.decode('=?' + tok + '?=')
except ValueError: except (ValueError, KeyError):
raise _InvalidEwError( raise _InvalidEwError(
"encoded word format invalid: '{}'".format(ew.cte)) "encoded word format invalid: '{}'".format(ew.cte))
ew.charset = charset ew.charset = charset
......
...@@ -58,6 +58,8 @@ class TestDecode(TestEmailBase): ...@@ -58,6 +58,8 @@ class TestDecode(TestEmailBase):
_ew.decode('=?') _ew.decode('=?')
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
_ew.decode('') _ew.decode('')
with self.assertRaises(KeyError):
_ew.decode('=?utf-8?X?somevalue?=')
def _test(self, source, result, charset='us-ascii', lang='', defects=[]): def _test(self, source, result, charset='us-ascii', lang='', defects=[]):
res, char, l, d = _ew.decode(source) res, char, l, d = _ew.decode(source)
......
...@@ -89,6 +89,10 @@ class TestParser(TestParserMixin, TestEmailBase): ...@@ -89,6 +89,10 @@ class TestParser(TestParserMixin, TestEmailBase):
with self.assertRaises(errors.HeaderParseError): with self.assertRaises(errors.HeaderParseError):
parser.get_encoded_word('=?abc?=') parser.get_encoded_word('=?abc?=')
def test_get_encoded_word_invalid_cte(self):
with self.assertRaises(errors.HeaderParseError):
parser.get_encoded_word('=?utf-8?X?somevalue?=')
def test_get_encoded_word_valid_ew(self): def test_get_encoded_word_valid_ew(self):
self._test_get_x(parser.get_encoded_word, self._test_get_x(parser.get_encoded_word,
'=?us-ascii?q?this_is_a_test?= bird', '=?us-ascii?q?this_is_a_test?= bird',
...@@ -399,6 +403,14 @@ class TestParser(TestParserMixin, TestEmailBase): ...@@ -399,6 +403,14 @@ class TestParser(TestParserMixin, TestEmailBase):
[], [],
'') '')
def test_get_unstructured_invalid_ew_cte(self):
self._test_get_x(self._get_unst,
'=?utf-8?X?=somevalue?=',
'=?utf-8?X?=somevalue?=',
'=?utf-8?X?=somevalue?=',
[],
'')
# get_qp_ctext # get_qp_ctext
def test_get_qp_ctext_only(self): def test_get_qp_ctext_only(self):
......
Prevent :exc:`KeyError` thrown by :func:`_encoded_words.decode` when given
an encoded-word with invalid content-type encoding from propagating all the
way to :func:`email.message.get`.
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