From 650720a0cfa1673938e6d1bad53b6c37c9edb47d Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Thu, 20 Jan 2022 15:34:13 +0000 Subject: [PATCH] Fix the caret position in some syntax errors in interactive mode (GH-30718) --- Parser/pegen_errors.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Parser/pegen_errors.c b/Parser/pegen_errors.c index f348ac3000d..0be9df0ae55 100644 --- a/Parser/pegen_errors.c +++ b/Parser/pegen_errors.c @@ -251,14 +251,15 @@ get_error_line_from_tokenizer_buffers(Parser *p, Py_ssize_t lineno) assert(cur_line != NULL); 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; for (int i = 0; i < relative_lineno - 1; i++) { char *new_line = strchr(cur_line, '\n') + 1; // The assert is here for debug builds but the conditional that // follows is there so in release builds we do not crash at the cost // to report a potentially wrong line. - assert(new_line != NULL && new_line < p->tok->inp); - if (new_line == NULL || new_line >= p->tok->inp) { + assert(new_line != NULL && new_line <= buf_end); + if (new_line == NULL || new_line > buf_end) { break; } cur_line = new_line;