From 204d59d9cbe7bebc3be403680f129f1e15de6531 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Mon, 1 Apr 2019 18:35:20 +0900 Subject: [PATCH 1/2] bpo-20844: open script file with "rb" mode (GH-12616) (cherry picked from commit 10654c19b5e6efdf3c529ff9bf7bcab89bdca1c1) --- Doc/c-api/veryhigh.rst | 4 ++++ Lib/test/test_cmd_line_script.py | 17 +++++++++++++++++ .../2019-03-29-18-47-50.bpo-20844.ge-7SM.rst | 2 ++ Modules/main.c | 2 +- 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index c891f6320f944f..317093e95615e3 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -109,6 +109,10 @@ the same library that the Python runtime is using. (:func:`sys.getfilesystemencoding`). If *closeit* is true, the file is closed before PyRun_SimpleFileExFlags returns. + .. note:: + On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``. + Otherwise, Python may not handle script file with LF line ending correctly. + .. c:function:: int PyRun_InteractiveOne(FILE *fp, const char *filename) diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 5ec9bbbb1230e6..b2632602d454b9 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -387,6 +387,23 @@ def test_issue8202_dash_m_file_ignored(self): script_name, script_name, script_dir, '', importlib.machinery.SourceFileLoader) + def test_issue20884(self): + # On Windows, script with encoding cookie and LF line ending + # will be failed. + with support.temp_dir() as script_dir: + script_name = os.path.join(script_dir, "issue20884.py") + with open(script_name, "w", newline='\n') as f: + f.write("#coding: iso-8859-1\n") + f.write('"""\n') + for _ in range(30): + f.write('x'*80 + '\n') + f.write('"""\n') + + with support.change_cwd(path=script_dir): + rc, out, err = assert_python_ok(script_name) + self.assertEqual(b"", out) + self.assertEqual(b"", err) + @contextlib.contextmanager def setup_test_pkg(self, *args): with support.temp_dir() as script_dir, \ diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst new file mode 100644 index 00000000000000..22a400ae7c8f02 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst @@ -0,0 +1,2 @@ +Fix running script with encoding cookie and LF line ending +may fail on Windows. diff --git a/Modules/main.c b/Modules/main.c index 9011bd1f69cb05..e3683b9417545b 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1534,7 +1534,7 @@ pymain_open_filename(_PyMain *pymain) const _PyCoreConfig *config = &_PyGILState_GetInterpreterStateUnsafe()->core_config; FILE* fp; - fp = _Py_wfopen(pymain->filename, L"r"); + fp = _Py_wfopen(pymain->filename, L"rb"); if (fp == NULL) { char *cfilename_buffer; const char *cfilename; From 7003d5ea98c820aa433e9e256bb5d2507c77c1c9 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Mon, 1 Apr 2019 18:42:56 +0900 Subject: [PATCH 2/2] [3.7] bpo-20844: open script file with "rb" mode (GH-12616). (cherry picked from commit 10654c19b5e6efdf3c529ff9bf7bcab89bdca1c1) Co-authored-by: Inada Naoki