Skip to content

Commit 2078cc8

Browse files
committed
Raise HeaderParseError instead of continuing when parsing a word.
Also, modify the testcase.
1 parent 3540fc9 commit 2078cc8

3 files changed

Lines changed: 13 additions & 22 deletions

File tree

Lib/email/_header_value_parser.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,16 +1360,13 @@ def get_word(value):
13601360
leader, value = get_cfws(value)
13611361
else:
13621362
leader = None
1363-
if value:
1364-
if value[0]=='"':
1365-
token, value = get_quoted_string(value)
1366-
elif value[0] in SPECIALS:
1367-
raise errors.HeaderParseError("Expected 'atom' or 'quoted-string' "
1368-
"but found '{}'".format(value))
1369-
else:
1370-
token, value = get_atom(value)
1371-
if leader is not None:
1372-
token[:0] = [leader]
1363+
if not value:
1364+
raise errors.HeaderParseError("Expected 'atom' or 'quoted-string' "
1365+
"but found nothing.")
1366+
if value[0]=='"':
1367+
token, value = get_quoted_string(value)
1368+
elif value[0] in SPECIALS:
1369+
raise errors.HeaderParseError((value))
13731370
else:
13741371
token, value = get_atom(value)
13751372
if leader is not None:

Lib/test/test_email/test__header_value_parser.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -931,18 +931,10 @@ def test_get_word_atom_yields_atom(self):
931931
self.assertEqual(word[0].token_type, 'cfws')
932932

933933
def test_get_word_all_CFWS(self):
934-
word = self._test_get_x(parser.get_word,
935-
'(Recipients list suppressed',
936-
str(parser.CFWSList([parser.Comment([
937-
parser.WhiteSpaceTerminal('Recipients', 'ptext'),
938-
parser.WhiteSpaceTerminal(' ', 'fws'),
939-
parser.WhiteSpaceTerminal('list', 'ptext'),
940-
parser.WhiteSpaceTerminal(' ', 'fws'),
941-
parser.WhiteSpaceTerminal('suppressed', 'ptext')
942-
])])),
943-
' ', [], ''
944-
)
945-
self.assertEqual(word.token_type, 'cfws')
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')
946938

947939
def test_get_word_qs_yields_qs(self):
948940
word = self._test_get_x(parser.get_word,
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 with only comments in some headers.
2+
Patch by Abhilash Raj.

0 commit comments

Comments
 (0)