mirror of https://github.com/python/cpython
gh-125666: Avoid PyREPL exiting when a null byte is in input (#125732)
This commit is contained in:
parent
51b012b2a8
commit
44becb8cba
|
@ -136,7 +136,8 @@ class InteractiveInterpreter:
|
||||||
# Set the line of text that the exception refers to
|
# Set the line of text that the exception refers to
|
||||||
lines = source.splitlines()
|
lines = source.splitlines()
|
||||||
if (source and typ is SyntaxError
|
if (source and typ is SyntaxError
|
||||||
and not value.text and len(lines) >= value.lineno):
|
and not value.text and value.lineno is not None
|
||||||
|
and len(lines) >= value.lineno):
|
||||||
value.text = lines[value.lineno - 1]
|
value.text = lines[value.lineno - 1]
|
||||||
sys.last_exc = sys.last_value = value
|
sys.last_exc = sys.last_value = value
|
||||||
if sys.excepthook is sys.__excepthook__:
|
if sys.excepthook is sys.__excepthook__:
|
||||||
|
|
|
@ -117,6 +117,15 @@ SyntaxError: duplicate argument 'x' in function definition"""
|
||||||
console.runsource(source)
|
console.runsource(source)
|
||||||
mock_showsyntaxerror.assert_called_once()
|
mock_showsyntaxerror.assert_called_once()
|
||||||
|
|
||||||
|
def test_runsource_survives_null_bytes(self):
|
||||||
|
console = InteractiveColoredConsole()
|
||||||
|
source = "\x00\n"
|
||||||
|
f = io.StringIO()
|
||||||
|
with contextlib.redirect_stdout(f), contextlib.redirect_stderr(f):
|
||||||
|
result = console.runsource(source)
|
||||||
|
self.assertFalse(result)
|
||||||
|
self.assertIn("source code string cannot contain null bytes", f.getvalue())
|
||||||
|
|
||||||
def test_no_active_future(self):
|
def test_no_active_future(self):
|
||||||
console = InteractiveColoredConsole()
|
console = InteractiveColoredConsole()
|
||||||
source = dedent("""\
|
source = dedent("""\
|
||||||
|
|
|
@ -1313,6 +1313,11 @@ class TestMain(ReplTestCase):
|
||||||
self.assertIn("in x3", output)
|
self.assertIn("in x3", output)
|
||||||
self.assertIn("in <module>", output)
|
self.assertIn("in <module>", output)
|
||||||
|
|
||||||
|
def test_null_byte(self):
|
||||||
|
output, exit_code = self.run_repl("\x00\nexit()\n")
|
||||||
|
self.assertEqual(exit_code, 0)
|
||||||
|
self.assertNotIn("TypeError", output)
|
||||||
|
|
||||||
def test_readline_history_file(self):
|
def test_readline_history_file(self):
|
||||||
# skip, if readline module is not available
|
# skip, if readline module is not available
|
||||||
readline = import_module('readline')
|
readline = import_module('readline')
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Avoid the exiting the interpreter if a null byte is given as input in the new REPL.
|
Loading…
Reference in New Issue