summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInada Naoki <songofacandy@gmail.com>2019-04-01 18:35:20 +0900
committerInada Naoki <songofacandy@gmail.com>2019-04-01 18:42:41 +0900
commit204d59d9cbe7bebc3be403680f129f1e15de6531 (patch)
tree06a3f4584984a63fba6a62ed26271d56f688a256
parenta37f356de19828241bf19129f804369794c72ed3 (diff)
downloadcpython-git-204d59d9cbe7bebc3be403680f129f1e15de6531.tar.gz
bpo-20844: open script file with "rb" mode (GH-12616)
(cherry picked from commit 10654c19b5e6efdf3c529ff9bf7bcab89bdca1c1)
-rw-r--r--Doc/c-api/veryhigh.rst4
-rw-r--r--Lib/test/test_cmd_line_script.py17
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst2
-rw-r--r--Modules/main.c2
4 files changed, 24 insertions, 1 deletions
diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst
index c891f6320f..317093e956 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 5ec9bbbb12..b2632602d4 100644
--- a/Lib/test/test_cmd_line_script.py
+++ b/Lib/test/test_cmd_line_script.py
@@ -387,6 +387,23 @@ class CmdLineTest(unittest.TestCase):
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 0000000000..22a400ae7c
--- /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 9011bd1f69..e3683b9417 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;