mirror of https://github.com/python/cpython
bpo-44396: Update multi-line-start location when reallocating tokenizer buffers (GH-26676)
Automerge-Triggered-By: GH:pablogsal
This commit is contained in:
parent
9d8dd8f08a
commit
a342cc5891
|
@ -29,6 +29,13 @@ class EOFTestCase(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
raise support.TestFailed
|
raise support.TestFailed
|
||||||
|
|
||||||
|
def test_EOFS_with_file(self):
|
||||||
|
expect = ("(<string>, line 1)")
|
||||||
|
with os_helper.temp_dir() as temp_dir:
|
||||||
|
file_name = script_helper.make_script(temp_dir, 'foo', """'''this is \na \ntest""")
|
||||||
|
rc, out, err = script_helper.assert_python_failure(file_name)
|
||||||
|
self.assertIn(b'unterminated triple-quoted string literal (detected at line 3)', err)
|
||||||
|
|
||||||
def test_eof_with_line_continuation(self):
|
def test_eof_with_line_continuation(self):
|
||||||
expect = "unexpected EOF while parsing (<string>, line 1)"
|
expect = "unexpected EOF while parsing (<string>, line 1)"
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix a possible crash in the tokenizer when raising syntax errors for
|
||||||
|
unclosed strings. Patch by Pablo Galindo.
|
|
@ -372,6 +372,8 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size)
|
||||||
if (newsize > tok->end - tok->buf) {
|
if (newsize > tok->end - tok->buf) {
|
||||||
char *newbuf = tok->buf;
|
char *newbuf = tok->buf;
|
||||||
Py_ssize_t start = tok->start == NULL ? -1 : tok->start - tok->buf;
|
Py_ssize_t start = tok->start == NULL ? -1 : tok->start - tok->buf;
|
||||||
|
Py_ssize_t line_start = tok->start == NULL ? -1 : tok->line_start - tok->buf;
|
||||||
|
Py_ssize_t multi_line_start = tok->multi_line_start - tok->buf;
|
||||||
newbuf = (char *)PyMem_Realloc(newbuf, newsize);
|
newbuf = (char *)PyMem_Realloc(newbuf, newsize);
|
||||||
if (newbuf == NULL) {
|
if (newbuf == NULL) {
|
||||||
tok->done = E_NOMEM;
|
tok->done = E_NOMEM;
|
||||||
|
@ -382,6 +384,8 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size)
|
||||||
tok->inp = tok->buf + oldsize;
|
tok->inp = tok->buf + oldsize;
|
||||||
tok->end = tok->buf + newsize;
|
tok->end = tok->buf + newsize;
|
||||||
tok->start = start < 0 ? NULL : tok->buf + start;
|
tok->start = start < 0 ? NULL : tok->buf + start;
|
||||||
|
tok->line_start = line_start < 0 ? NULL : tok->buf + line_start;
|
||||||
|
tok->multi_line_start = multi_line_start < 0 ? NULL : tok->buf + multi_line_start;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1883,6 +1887,7 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end)
|
||||||
while (end_quote_size != quote_size) {
|
while (end_quote_size != quote_size) {
|
||||||
c = tok_nextc(tok);
|
c = tok_nextc(tok);
|
||||||
if (c == EOF || (quote_size == 1 && c == '\n')) {
|
if (c == EOF || (quote_size == 1 && c == '\n')) {
|
||||||
|
assert(tok->multi_line_start != NULL);
|
||||||
// shift the tok_state's location into
|
// shift the tok_state's location into
|
||||||
// the start of string, and report the error
|
// the start of string, and report the error
|
||||||
// from the initial quote character
|
// from the initial quote character
|
||||||
|
|
Loading…
Reference in New Issue