]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-125666: Avoid PyREPL exiting when a null byte is in input (#125732)
authordevdanzin <74280297+devdanzin@users.noreply.github.com>
Sun, 27 Oct 2024 01:23:53 +0000 (22:23 -0300)
committerGitHub <noreply@github.com>
Sun, 27 Oct 2024 01:23:53 +0000 (01:23 +0000)
Lib/code.py
Lib/test/test_pyrepl/test_interact.py
Lib/test/test_pyrepl/test_pyrepl.py
Misc/NEWS.d/next/Library/2024-10-19-16-06-52.gh-issue-125666.jGfdCP.rst [new file with mode: 0644]

index c7c59ee20219c513e888f8d746204750b405b38a..1cc2ed8b1dbf28f4c4544747a757099de843af7e 100644 (file)
@@ -136,7 +136,8 @@ class InteractiveInterpreter:
         # 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__:
index 0c6df4e5dae86988baa86ce5b7d2e34e04cf7505..e0ee310e2c4dbc66d75937443c2e980cb5700b57 100644 (file)
@@ -117,6 +117,15 @@ SyntaxError: duplicate argument 'x' in function definition"""
             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("""\
index 1a76832386bf1dd4dd5c7e92bd1bf5fab5ef5211..f29a7ffbd7cafdff2d47370782e0205552d42301 100644 (file)
@@ -1313,6 +1313,11 @@ class TestMain(ReplTestCase):
                         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')
diff --git a/Misc/NEWS.d/next/Library/2024-10-19-16-06-52.gh-issue-125666.jGfdCP.rst b/Misc/NEWS.d/next/Library/2024-10-19-16-06-52.gh-issue-125666.jGfdCP.rst
new file mode 100644 (file)
index 0000000..3b44888
--- /dev/null
@@ -0,0 +1 @@
+Avoid the exiting the interpreter if a null byte is given as input in the new REPL.