summaryrefslogtreecommitdiffstats
path: root/Lib/email
diff options
context:
space:
mode:
authorIvan Savin <acccko@gmail.com>2024-04-17 10:14:22 (GMT)
committerGitHub <noreply@github.com>2024-04-17 10:14:22 (GMT)
commit1aa8bbe62f27b564cf15e2aad591c62744354a4e (patch)
tree2605acdb0e682590897d219352efb582ba72f035 /Lib/email
parent147cd0581e35a10204776029aeaa7fa1901056bc (diff)
downloadcpython-1aa8bbe62f27b564cf15e2aad591c62744354a4e.zip
cpython-1aa8bbe62f27b564cf15e2aad591c62744354a4e.tar.gz
cpython-1aa8bbe62f27b564cf15e2aad591c62744354a4e.tar.bz2
bpo-40944: Fix IndexError when parse emails with truncated Message-ID, address, routes, etc (GH-20790)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib/email')
-rw-r--r--Lib/email/_header_value_parser.py15
1 files changed, 10 insertions, 5 deletions
diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py
index 7755e62..d1b4c7d 100644
--- a/Lib/email/_header_value_parser.py
+++ b/Lib/email/_header_value_parser.py
@@ -1213,7 +1213,7 @@ def get_bare_quoted_string(value):
value is the text between the quote marks, with whitespace
preserved and quoted pairs decoded.
"""
- if value[0] != '"':
+ if not value or value[0] != '"':
raise errors.HeaderParseError(
"expected '\"' but found '{}'".format(value))
bare_quoted_string = BareQuotedString()
@@ -1454,7 +1454,7 @@ def get_local_part(value):
"""
local_part = LocalPart()
leader = None
- if value[0] in CFWS_LEADER:
+ if value and value[0] in CFWS_LEADER:
leader, value = get_cfws(value)
if not value:
raise errors.HeaderParseError(
@@ -1613,7 +1613,7 @@ def get_domain(value):
"""
domain = Domain()
leader = None
- if value[0] in CFWS_LEADER:
+ if value and value[0] in CFWS_LEADER:
leader, value = get_cfws(value)
if not value:
raise errors.HeaderParseError(
@@ -1689,6 +1689,8 @@ def get_obs_route(value):
if value[0] in CFWS_LEADER:
token, value = get_cfws(value)
obs_route.append(token)
+ if not value:
+ break
if value[0] == '@':
obs_route.append(RouteComponentMarker)
token, value = get_domain(value[1:])
@@ -1707,7 +1709,7 @@ def get_angle_addr(value):
"""
angle_addr = AngleAddr()
- if value[0] in CFWS_LEADER:
+ if value and value[0] in CFWS_LEADER:
token, value = get_cfws(value)
angle_addr.append(token)
if not value or value[0] != '<':
@@ -1717,7 +1719,7 @@ def get_angle_addr(value):
value = value[1:]
# Although it is not legal per RFC5322, SMTP uses '<>' in certain
# circumstances.
- if value[0] == '>':
+ if value and value[0] == '>':
angle_addr.append(ValueTerminal('>', 'angle-addr-end'))
angle_addr.defects.append(errors.InvalidHeaderDefect(
"null addr-spec in angle-addr"))
@@ -1769,6 +1771,9 @@ def get_name_addr(value):
name_addr = NameAddr()
# Both the optional display name and the angle-addr can start with cfws.
leader = None
+ if not value:
+ raise errors.HeaderParseError(
+ "expected name-addr but found '{}'".format(value))
if value[0] in CFWS_LEADER:
leader, value = get_cfws(value)
if not value: