bpo-47117: Don't crash if we fail to decode characters when the tokenizer buffers are uninitialized (GH-32129)

Automerge-Triggered-By: GH:pablogsal
This commit is contained in:
Pablo Galindo Salgado 2022-03-26 16:29:02 +00:00 committed by GitHub
parent ee912ad6f6
commit 26cca8067b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 2 deletions

View File

@ -0,0 +1,2 @@
Fix a crash if we fail to decode characters in interactive mode if the
tokenizer buffers are uninitialized. Patch by Pablo Galindo.

View File

@ -248,7 +248,12 @@ get_error_line_from_tokenizer_buffers(Parser *p, Py_ssize_t lineno)
assert((p->tok->fp == NULL && p->tok->str != NULL) || p->tok->fp == stdin); assert((p->tok->fp == NULL && p->tok->str != NULL) || p->tok->fp == stdin);
char *cur_line = p->tok->fp_interactive ? p->tok->interactive_src_start : p->tok->str; char *cur_line = p->tok->fp_interactive ? p->tok->interactive_src_start : p->tok->str;
assert(cur_line != NULL); if (cur_line == NULL) {
assert(p->tok->fp_interactive);
// We can reach this point if the tokenizer buffers for interactive source have not been
// initialized because we failed to decode the original source with the given locale.
return PyUnicode_FromStringAndSize("", 0);
}
Py_ssize_t relative_lineno = p->starting_lineno ? lineno - p->starting_lineno + 1 : lineno; Py_ssize_t relative_lineno = p->starting_lineno ? lineno - p->starting_lineno + 1 : lineno;
const char* buf_end = p->tok->fp_interactive ? p->tok->interactive_src_end : p->tok->inp; const char* buf_end = p->tok->fp_interactive ? p->tok->interactive_src_end : p->tok->inp;
@ -311,7 +316,7 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype,
goto error; goto error;
} }
if (p->tok->fp_interactive) { if (p->tok->fp_interactive && p->tok->interactive_src_start != NULL) {
error_line = get_error_line_from_tokenizer_buffers(p, lineno); error_line = get_error_line_from_tokenizer_buffers(p, lineno);
} }
else if (p->start_rule == Py_file_input) { else if (p->start_rule == Py_file_input) {