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
Extended ASCII characters in multiline strings cause "SystemError: Negative size passed to PyUnicode_New" when the encoding is not specified #96611
In some cases, when dealing with multi-line string with non-utf8 encoded files, python will throw a SystemError: Negative size passed to PyUnicode_New and not execute any code.
Minimal test case:
print("""
ą""")
This is only a problem if the non-utf8 character lies on a new line (at any point in the line)
A similar test case behaves correctly
print("""ą""")
And reports an encoding warning, which is the expected behavior
SyntaxError: Non-UTF-8 code starting with '\xb1' in file C:\Users\xxxxx\test.py on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details
Since this is an encoding related errors, both files are attached (as .txt, GitHub does not allow .py attachments). test.txt - single line (correct behavior) test_ml.txt - multi line (bug)
My environment
CPython versions tested on: Python 3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)] on win32
Operating system and architecture: Windows 10 Pro 21H2 (19044.1826)
In this case, however, tok->done is E_DECODE instead of E_EOF. This gets set by error_ret(), which also clears tok->start and tok->cur to NULL. The above code increments tok->cur to 1. Subsequently, _syntaxerror_range() tries to decode the text for the syntax error using the negative size 1 - tok->line_start.
Activity
mdboom commentedon Sep 6, 2022
#96270 may fix this. Let me confirm.
mdboom commentedon Sep 6, 2022
It does not fix this.
mdboom commentedon Sep 6, 2022
Since copy-and-paste doesn't usually preserve broken encodings, this is a convenient way to reproduce the bug:
eryksun commentedon Sep 6, 2022
In
tok_get()in "Parser/tokenizer.c", the following code blindly handlesEOFreturned fromtok_nextc()as if it's the end of the file.cpython/Parser/tokenizer.c
Lines 1936 to 1948 in 6744490
In this case, however,
tok->doneisE_DECODEinstead ofE_EOF. This gets set byerror_ret(), which also clearstok->startandtok->curtoNULL. The above code incrementstok->curto 1. Subsequently,_syntaxerror_range()tries to decode the text for the syntax error using the negative size1 - tok->line_start.pythongh-96611: Fix error message for invalid UTF-8 in mid-multiline …
gh-96611: Fix error message for invalid UTF-8 in mid-multiline string (…
pythongh-96611: Fix error message for invalid UTF-8 in mid-multiline …
pythongh-96611: Fix error message for invalid UTF-8 in mid-multiline …
gh-96611: Fix error message for invalid UTF-8 in mid-multiline string (…
gh-96611: Fix error message for invalid UTF-8 in mid-multiline string (…
mdboom commentedon Sep 7, 2022
Thanks for the report, @polprog, and the diagnostics, @eryksun.