mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
bpo-33529, email: Fix infinite loop in email header encoding (GH-12020)
This commit is contained in:
parent
4d45a3b110
commit
c1f5667be1
4 changed files with 27 additions and 14 deletions
|
@ -2723,16 +2723,19 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset):
|
|||
lines.append(' ')
|
||||
# XXX We'll get an infinite loop here if maxlen is <= 7
|
||||
continue
|
||||
first_part = to_encode[:text_space]
|
||||
ew = _ew.encode(first_part, charset=encode_as)
|
||||
excess = len(ew) - remaining_space
|
||||
if excess > 0:
|
||||
# encode always chooses the shortest encoding, so this
|
||||
# is guaranteed to fit at this point.
|
||||
first_part = first_part[:-excess]
|
||||
ew = _ew.encode(first_part)
|
||||
lines[-1] += ew
|
||||
to_encode = to_encode[len(first_part):]
|
||||
|
||||
to_encode_word = to_encode[:text_space]
|
||||
encoded_word = _ew.encode(to_encode_word, charset=encode_as)
|
||||
excess = len(encoded_word) - remaining_space
|
||||
while excess > 0:
|
||||
# Since the chunk to encode is guaranteed to fit into less than 100 characters,
|
||||
# shrinking it by one at a time shouldn't take long.
|
||||
to_encode_word = to_encode_word[:-1]
|
||||
encoded_word = _ew.encode(to_encode_word, charset=encode_as)
|
||||
excess = len(encoded_word) - remaining_space
|
||||
lines[-1] += encoded_word
|
||||
to_encode = to_encode[len(to_encode_word):]
|
||||
|
||||
if to_encode:
|
||||
lines.append(' ')
|
||||
new_last_ew = len(lines[-1])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue