Issue 33476: String index out of range in get_group(), email/_header_value_parser.py (original) (raw)

When address group is missing final ';', 'value' will be an empty string. I suggest the following patch

$ diff -u _save_header_value_parser.py _header_value_parser.py --- _save_header_value_parser.py 2018-03-14 01:07:54.000000000 +0100 +++ _header_value_parser.py 2018-05-13 02:17:13.830053600 +0200 @@ -1876,7 +1876,7 @@ if not value: group.defects.append(errors.InvalidHeaderDefect( "end of header in group"))

Unsure how to issue a "PR" (Problem Report?) with a test case.

Here is my best effort:

Create a file "email.eml" in the current directory, as attached. (The contents were lifted from RFC2822 section A.1.3, but I deleted the ";" at the end of the "To" header. The file has CRLF line endings.)

Then run the following test program (It appears that I can only attach one file to this ).

$ cat test-bug.py from email.policy import default import email

with open('email.eml', 'rb') as f: msg = email.message_from_binary_file(f, policy=default) toheader = msg['To'] for addr in toheader.addresses: print(addr)

#----------------------------------------------------

Output without the fix:

$ python3.6.5 test-bug.py Traceback (most recent call last): File "test-bug.py", line 6, in toheader = msg['To'] File "C:\Program Files\Python36\lib\email\message.py", line 391, in getitem return self.get(name) File "C:\Program Files\Python36\lib\email\message.py", line 471, in get return self.policy.header_fetch_parse(k, v) File "C:\Program Files\Python36\lib\email\policy.py", line 162, in header_fetch_parse return self.header_factory(name, value) File "C:\Program Files\Python36\lib\email\headerregistry.py", line 589, in call return self[name](name, value) File "C:\Program Files\Python36\lib\email\headerregistry.py", line 197, in new cls.parse(value, kwds) File "C:\Program Files\Python36\lib\email\headerregistry.py", line 340, in parse kwds['parse_tree'] = address_list = cls.value_parser(value) File "C:\Program Files\Python36\lib\email\headerregistry.py", line 331, in value_parser address_list, value = parser.get_address_list(value) File "C:\Program Files\Python36\lib\email_header_value_parser.py", line 1931, in get_address_list token, value = get_address(value) File "C:\Program Files\Python36\lib\email_header_value_parser.py", line 1908, in get_address token, value = get_group(value) File "C:\Program Files\Python36\lib\email_header_value_parser.py", line 1879, in get_group if value[0] != ';': IndexError: string index out of range

#-----------------------------------------------------

Output with the fix:

$ test-bug.py Chris Jones <c@a.test> joe@where.test John <jdoe@one.test>