Skip to content

Commit 7213df7

Browse files
maxkingwarsaw
authored andcommitted
bpo-29412: Fix indexError when parsing a header value ending unexpectedly (GH-14387)
* patched string index out of range error in get_word function of _header_value_parser.py and created tests in test__header_value_parser.py for CFWS. * Raise HeaderParseError instead of continuing when parsing a word.
1 parent 2a7d596 commit 7213df7

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

Lib/email/_header_value_parser.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,9 @@ def get_word(value):
13601360
leader, value = get_cfws(value)
13611361
else:
13621362
leader = None
1363+
if not value:
1364+
raise errors.HeaderParseError(
1365+
"Expected 'atom' or 'quoted-string' but found nothing.")
13631366
if value[0]=='"':
13641367
token, value = get_quoted_string(value)
13651368
elif value[0] in SPECIALS:

Lib/test/test_email/test__header_value_parser.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,12 @@ def test_get_word_atom_yields_atom(self):
930930
self.assertEqual(word.token_type, 'atom')
931931
self.assertEqual(word[0].token_type, 'cfws')
932932

933+
def test_get_word_all_CFWS(self):
934+
# bpo-29412: Test that we don't raise IndexError when parsing CFWS only
935+
# token.
936+
with self.assertRaises(errors.HeaderParseError):
937+
parser.get_word('(Recipients list suppressed')
938+
933939
def test_get_word_qs_yields_qs(self):
934940
word = self._test_get_x(parser.get_word,
935941
'"bar " (bang) ah', '"bar " (bang) ', 'bar ', [], 'ah')
@@ -2343,6 +2349,17 @@ def test_get_address_quoted_strings_in_atom_list(self):
23432349

23442350
# get_address_list
23452351

2352+
def test_get_address_list_CFWS(self):
2353+
address_list = self._test_get_x(parser.get_address_list,
2354+
'(Recipient list suppressed)',
2355+
'(Recipient list suppressed)',
2356+
' ',
2357+
[errors.ObsoleteHeaderDefect], # no content in address list
2358+
'')
2359+
self.assertEqual(address_list.token_type, 'address-list')
2360+
self.assertEqual(len(address_list.mailboxes), 0)
2361+
self.assertEqual(address_list.mailboxes, address_list.all_mailboxes)
2362+
23462363
def test_get_address_list_mailboxes_simple(self):
23472364
address_list = self._test_get_x(parser.get_address_list,
23482365
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix IndexError in parsing a header value ending unexpectedly. Patch by Abhilash
2+
Raj.

0 commit comments

Comments
 (0)