You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
get_obs_local_part fails to handle empty local part #86650
Traceback (most recent call last):
File "/usr/lib/python3.8/email/_header_value_parser.py", line 2069, in get_msg_id
token, value = get_dot_atom_text(value)
File "/usr/lib/python3.8/email/_header_value_parser.py", line 1334, in get_dot_atom_textraise errors.HeaderParseError("expected atom at a start of "email.errors.HeaderParseError: expected atom at a start of dot-atom-text but found '[>'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 4, in <module>
msg['Message-ID'] ='<[>'
File "/usr/lib/python3.8/email/message.py", line 409, in __setitem__self._headers.append(self.policy.header_store_parse(name, val))
File "/usr/lib/python3.8/email/policy.py", line 148, in header_store_parsereturn (name, self.header_factory(name, value))
File "/usr/lib/python3.8/email/headerregistry.py", line 607, in __call__returnself[name](name, value)
File "/usr/lib/python3.8/email/headerregistry.py", line 202, in __new__cls.parse(value, kwds)
File "/usr/lib/python3.8/email/headerregistry.py", line 535, in parse
kwds['parse_tree'] = parse_tree =cls.value_parser(value)
File "/usr/lib/python3.8/email/_header_value_parser.py", line 2126, in parse_message_id
token, value = get_msg_id(value)
File "/usr/lib/python3.8/email/_header_value_parser.py", line 2073, in get_msg_id
token, value = get_obs_local_part(value)
File "/usr/lib/python3.8/email/_header_value_parser.py", line 1516, in get_obs_local_partif (obs_local_part[0].token_type =='dot'orIndexError: list index out of range
as you can see in the traceback
get_msg_id() calls get_obs_local_part()
and in get_obs_local_part(), you have this
defget_obs_local_part(value):
obs_local_part=ObsLocalPart()
whilevalueand (value[0]=='\\'orvalue[0] notinPHRASE_ENDS):
...
if (obs_local_part[0].token_type=='dot':
...
if value does not satisfy the condition in the while loop,
this gives an IndexError as obs_local_part is empty
(the value in my example is '[>' from the message id '<[>')
shouldn't we have a proper Error or default back to no parsing if parsing fails?
There's no way of bypassing the parser and getting the Message-ID and
I can't even handle the error with a try catch
Yep, you've found another in a category of bugs that have shown up in the parser: places where there is a missing check for there being any value at all before checking character [0].
changed the title [-]parse_message_id, get_msg_id, get_obs_local_part is poorly written[/-][+]get_obs_local_part fails to handle empty local part[/+]on Nov 30, 2020
changed the title [-]parse_message_id, get_msg_id, get_obs_local_part is poorly written[/-][+]get_obs_local_part fails to handle empty local part[/+]on Nov 30, 2020
Activity
dicksonch commentedon Nov 27, 2020
parse_message_id in the email module crashes with bogus message-id
Having a Message-ID '<[>' gives me an IndexError: list index out of range
This happens when
creating an EmailMessage with the said Message-ID
msg = EmailMessage()
msg['Message-ID'] = '<[>'
accessing the bogus Message-ID through
msg.items()
or
msg.get('Message-ID')
this doesn't happen with python 3.6 or 3.7 when MessageIDHeader didn't exist
3.8/Lib/email/headerregistry.py line 542
as you can see in the traceback
get_msg_id() calls get_obs_local_part()
and in get_obs_local_part(), you have this
if value does not satisfy the condition in the while loop,
this gives an IndexError as obs_local_part is empty
(the value in my example is '[>' from the message id '<[>')
shouldn't we have a proper Error or default back to no parsing if parsing fails?
There's no way of bypassing the parser and getting the Message-ID and
I can't even handle the error with a try catch
bitdancer commentedon Nov 30, 2020
Yep, you've found another in a category of bugs that have shown up in the parser: places where there is a missing check for there being any value at all before checking character [0].
In this case, the fix should be to add
just before the if that is blowing up.
[-]parse_message_id, get_msg_id, get_obs_local_part is poorly written[/-][+]get_obs_local_part fails to handle empty local part[/+][-]parse_message_id, get_msg_id, get_obs_local_part is poorly written[/-][+]get_obs_local_part fails to handle empty local part[/+]lesleyxyz commentedon Feb 27, 2023
I am currently experiencing this issue, has this been looked at yet? Is there a workaround?
fsc-eriker commentedon Feb 9, 2024
Duplicate of #105802
pythongh-86650: Fix IndexError when parse emails with invalid Message-ID
gh-86650: Fix IndexError when parse emails with invalid Message-ID (GâĶ
pythongh-86650: Fix IndexError when parse emails with invalid MessageâĶ
[3.12] gh-86650: Fix IndexError when parse emails with invalid MessagâĶ
pythongh-86650: Fix IndexError when parse emails with invalid MessageâĶ