This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Folding tries to slice from 0 to float("+inf") when maxlength is 0
Type: Stage: resolved
Components: email Versions: Python 3.7
process
Status: closed Resolution: duplicate
Dependencies: Superseder: non-ascii characters in headers causes TypeError on email.policy.Policy.fold
View: 33524
Assigned To: Nosy List: Lukas J, barry, matrixise, r.david.murray, xtreak
Priority: normal Keywords:

Created on 2019-02-13 12:08 by Lukas J, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (8)
msg335424 - (view) Author: Lukas J (Lukas J) Date: 2019-02-13 12:08
When converting an email.message.Message with the policy set to email.policy.EmailPolicy with all default settings, I eventually end up with this exception:



  File "/usr/lib/python3.7/email/_header_value_parser.py", line 2727, in _fold_as_ew
    first_part = to_encode[:text_space]
TypeError: slice indices must be integers or None or have an __index__ method



Which is caused because text_space is a float of value +inf. This is set  on line 2594 of the same file: maxlen = policy.max_line_length or float("+inf")

For some reason policy.max_line_length is set to zero, even though the default should be 78 after a glance into the source.


So there's maybe even two issues: 

1.) The fallback for maxlen shouldn't be float("+inf"), as that is not an integer and thus can't be sliced by. I think a big integer would suffice instead, for example 100000000

2.) policy.max_line_length seems to lose it's value in the default settings somewhere along the way if it isn't explicitly set.


Current workaround:
Set max_line_length of the policy to a value (78 is default)
msg335425 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python committer) Date: 2019-02-13 12:15
This seems to be same as issue33524 ?
msg335426 - (view) Author: Lukas J (Lukas J) Date: 2019-02-13 12:22
Indeed it is. Sorry I didn't find it before.

So it seems that changing float("+inf") to sys.maxsize would solve the problem? I've tried it in an interactive shell:

>>> a = "asd"; import sys
>>> a[:sys.maxsize]
'asd'
msg335430 - (view) Author: Stéphane Wirtel (matrixise) * (Python committer) Date: 2019-02-13 12:28
Could you share your example?

Thank you
msg335431 - (view) Author: Lukas J (Lukas J) Date: 2019-02-13 12:37
Minimal example:


import email.policy
import email.mime.text

responsehtml = "<html>somehtmlbody</html>"

msg = email.mime.text.MIMEText(responsehtml, "html", policy=email.policy.EmailPolicy())

msg["to"] = "test@example.com"
msg["cc"] = "äöü <foo@bar.com>"
msg["From"] = "foo@bar.com"
msg["Subject"] = "test"

msg.as_string()
msg335432 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python committer) Date: 2019-02-13 12:42
Thanks for the confirmation. I would propose closing this as a duplicate. The PR on the other issue might fix your issue and is just waiting on a NEWS entry.
msg335433 - (view) Author: Lukas J (Lukas J) Date: 2019-02-13 12:45
Ok thank you!
msg335435 - (view) Author: Stéphane Wirtel (matrixise) * (Python committer) Date: 2019-02-13 12:57
Just add the link to the other issue: https://bugs.python.org/issue33524
History
Date User Action Args
2022-04-11 14:59:11adminsetgithub: 80166
2019-02-13 13:06:27xtreaksetsuperseder: non-ascii characters in headers causes TypeError on email.policy.Policy.fold
2019-02-13 12:57:50matrixisesetmessages: + msg335435
2019-02-13 12:45:45Lukas Jsetstatus: open -> closed
resolution: duplicate
messages: + msg335433

stage: resolved
2019-02-13 12:42:58xtreaksetmessages: + msg335432
2019-02-13 12:37:00Lukas Jsetmessages: + msg335431
2019-02-13 12:28:04matrixisesetnosy: + matrixise
messages: + msg335430
2019-02-13 12:22:40Lukas Jsetmessages: + msg335426
2019-02-13 12:15:53xtreaksetnosy: + xtreak
messages: + msg335425
2019-02-13 12:08:03Lukas Jcreate