Skip to content

Commit b950cdb

Browse files
miss-islingtonmaxking
authored andcommitted
bpo-29412: Fix indexError when parsing a header value ending unexpectedly (GH-14387) (GH-14412)
* 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. (cherry picked from commit 7213df7) Co-authored-by: Abhilash Raj <maxking@users.noreply.github.com>
1 parent 6ef103f commit b950cdb

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
@@ -1358,6 +1358,9 @@ def get_word(value):
13581358
leader, value = get_cfws(value)
13591359
else:
13601360
leader = None
1361+
if not value:
1362+
raise errors.HeaderParseError(
1363+
"Expected 'atom' or 'quoted-string' but found nothing.")
13611364
if value[0]=='"':
13621365
token, value = get_quoted_string(value)
13631366
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
'dinsdale@example.com',
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)