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

pablogsal webhook-mailer at python.org
Sat Mar 26 14:26:13 EDT 2022


https://github.com/python/cpython/commit/27ee43183437c473725eba00def0ea7647688926
commit: 27ee43183437c473725eba00def0ea7647688926
branch: 3.10
author: Pablo Galindo Salgado <Pablogsal at gmail.com>
committer: pablogsal <Pablogsal at gmail.com>
date: 2022年03月26日T18:26:05Z
summary:
[3.10] bpo-47117: Don't crash if we fail to decode characters when the tokenizer buffers are uninitialized (GH-32129) (GH-32130)
Automerge-Triggered-By: GH:pablogsal.
(cherry picked from commit 26cca8067bf5306e372c0e90036d832c5021fd90)
Co-authored-by: Pablo Galindo Salgado <Pablogsal at gmail.com>
files:
A Misc/NEWS.d/next/Core and Builtins/2022-03-26-15-45-57.bpo-47117.60W6GQ.rst
M Parser/pegen.c
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-26-15-45-57.bpo-47117.60W6GQ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-26-15-45-57.bpo-47117.60W6GQ.rst
new file mode 100644
index 0000000000000..5098ed86d0793
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-03-26-15-45-57.bpo-47117.60W6GQ.rst	
@@ -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.
diff --git a/Parser/pegen.c b/Parser/pegen.c
index df17476013447..90a6ab98cf42e 100644
--- a/Parser/pegen.c
+++ b/Parser/pegen.c
@@ -435,7 +435,12 @@ get_error_line(Parser *p, Py_ssize_t lineno)
 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;
- 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);
+ }
 const char* buf_end = p->tok->fp_interactive ? p->tok->interactive_src_end : p->tok->inp;
 
 Py_ssize_t relative_lineno = p->starting_lineno ? lineno - p->starting_lineno + 1 : lineno;
@@ -495,7 +500,7 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype,
 goto error;
 }
 
- if (p->tok->fp_interactive) {
+ if (p->tok->fp_interactive && p->tok->interactive_src_start != NULL) {
 error_line = get_error_line(p, lineno);
 }
 else if (p->start_rule == Py_file_input) {


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /