# Set the line of text that the exception refers to
lines = source.splitlines()
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]
sys.last_exc = sys.last_value = value
if sys.excepthook is sys.__excepthook__:
console.runsource(source)
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):
console = InteractiveColoredConsole()
source = dedent("""\
self.assertIn("in x3", 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):
# skip, if readline module is not available
readline = import_module('readline')
--- /dev/null
+Avoid the exiting the interpreter if a null byte is given as input in the new REPL.