mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
gh-103824: fix use-after-free error in Parser/tokenizer.c (#103993)
This commit is contained in:
parent
99aab61062
commit
d5a97074d2
2 changed files with 18 additions and 1 deletions
|
@ -11,7 +11,7 @@ from unittest import TestCase, mock
|
||||||
from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
|
from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
|
||||||
INVALID_UNDERSCORE_LITERALS)
|
INVALID_UNDERSCORE_LITERALS)
|
||||||
from test.support import os_helper
|
from test.support import os_helper
|
||||||
from test.support.script_helper import run_test_script, make_script
|
from test.support.script_helper import run_test_script, make_script, run_python_until_end
|
||||||
import os
|
import os
|
||||||
import token
|
import token
|
||||||
|
|
||||||
|
@ -1470,6 +1470,19 @@ class TestTokenize(TestCase):
|
||||||
self.assertEqual(tok_name[tokens[i + 1].exact_type], tok_name[expected_tokens[i]])
|
self.assertEqual(tok_name[tokens[i + 1].exact_type], tok_name[expected_tokens[i]])
|
||||||
self.assertEqual(tok_name[tokens[-1].exact_type], tok_name[token.ENDMARKER])
|
self.assertEqual(tok_name[tokens[-1].exact_type], tok_name[token.ENDMARKER])
|
||||||
|
|
||||||
|
def test_invalid_character_in_fstring_middle(self):
|
||||||
|
# See gh-103824
|
||||||
|
script = b'''F"""
|
||||||
|
\xe5"""'''
|
||||||
|
|
||||||
|
with os_helper.temp_dir() as temp_dir:
|
||||||
|
filename = os.path.join(temp_dir, "script.py")
|
||||||
|
with open(filename, 'wb') as file:
|
||||||
|
file.write(script)
|
||||||
|
rs, _ = run_python_until_end(filename)
|
||||||
|
self.assertIn(b"SyntaxError", rs.err)
|
||||||
|
|
||||||
|
|
||||||
class UntokenizeTest(TestCase):
|
class UntokenizeTest(TestCase):
|
||||||
|
|
||||||
def test_bad_input_order(self):
|
def test_bad_input_order(self):
|
||||||
|
|
|
@ -2552,6 +2552,10 @@ f_string_middle:
|
||||||
while (end_quote_size != current_tok->f_string_quote_size) {
|
while (end_quote_size != current_tok->f_string_quote_size) {
|
||||||
int c = tok_nextc(tok);
|
int c = tok_nextc(tok);
|
||||||
if (c == EOF || (current_tok->f_string_quote_size == 1 && c == '\n')) {
|
if (c == EOF || (current_tok->f_string_quote_size == 1 && c == '\n')) {
|
||||||
|
if (tok->decoding_erred) {
|
||||||
|
return MAKE_TOKEN(ERRORTOKEN);
|
||||||
|
}
|
||||||
|
|
||||||
assert(tok->multi_line_start != NULL);
|
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue