bpo-46339: Fix crash in the parser when computing error text for multi-line f-strings (GH-30529)

Automerge-Triggered-By: GH:pablogsal
This commit is contained in:
Pablo Galindo Salgado 2022-01-11 16:30:39 +00:00 committed by GitHub
parent 43c5c1369c
commit cedec19be8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 2 deletions

View File

@ -280,6 +280,12 @@ class ExceptionTests(unittest.TestCase):
}
\"\"\"
}'''""", 5, 17)
check('''f"""
{
6
0="""''', 5, 13)
# Errors thrown by symtable.c
check('x = [(yield i) for i in range(3)]', 1, 7)

View File

@ -0,0 +1,3 @@
Fix a crash in the parser when retrieving the error text for multi-line
f-strings expressions that do not start in the first line of the string.
Patch by Pablo Galindo

View File

@ -250,8 +250,15 @@ get_error_line_from_tokenizer_buffers(Parser *p, Py_ssize_t lineno)
char *cur_line = p->tok->fp_interactive ? p->tok->interactive_src_start : p->tok->str;
assert(cur_line != NULL);
for (int i = 0; i < lineno - 1; i++) {
cur_line = strchr(cur_line, '\n') + 1;
Py_ssize_t relative_lineno = p->starting_lineno ? lineno - p->starting_lineno + 1 : lineno;
for (int i = 0; i < relative_lineno - 1; i++) {
char *new_line = strchr(cur_line, '\n') + 1;
assert(new_line != NULL && new_line < p->tok->inp);
if (new_line == NULL || new_line >= p->tok->inp) {
break;
}
cur_line = new_line;
}
char *next_newline;