summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2020-06-24 16:46:30 (GMT)
committerGitHub <noreply@github.com>2020-06-24 16:46:30 (GMT)
commita7dc71470156680f1fd5243290c6d377824b7ef4 (patch)
treebf3e39efe4cb3c94a9a83c4d6d470bd762452c77
parent33b79b11b891adea5a916df8e3779505b37aabe7 (diff)
downloadcpython-a7dc71470156680f1fd5243290c6d377824b7ef4.zip
cpython-a7dc71470156680f1fd5243290c6d377824b7ef4.tar.gz
cpython-a7dc71470156680f1fd5243290c6d377824b7ef4.tar.bz2
bpo-41094: Additional fix for PYTHONSTARTUP. (GH-21119)
-rw-r--r--Lib/test/test_embed.py4
-rw-r--r--Modules/main.c52
2 files changed, 45 insertions, 11 deletions
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index da70df7..e740fe8 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -1349,7 +1349,7 @@ class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
returncode=1)
def test_audit_run_interactivehook(self):
- startup = os.path.join(self.oldcwd, support.TESTFN) + (support.TESTFN or '') + ".py"
+ startup = os.path.join(self.oldcwd, support.TESTFN) + (support.FS_NONASCII or '') + ".py"
with open(startup, "w", encoding="utf-8") as f:
print("import sys", file=f)
print("sys.__interactivehook__ = lambda: None", file=f)
@@ -1362,7 +1362,7 @@ class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
os.unlink(startup)
def test_audit_run_startup(self):
- startup = os.path.join(self.oldcwd, support.TESTFN) + (support.TESTFN or '') + ".py"
+ startup = os.path.join(self.oldcwd, support.TESTFN) + (support.FS_NONASCII or '') + ".py"
with open(startup, "w", encoding="utf-8") as f:
print("pass", file=f)
try:
diff --git a/Modules/main.c b/Modules/main.c
index 8e3b35c..4a76f44 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -375,36 +375,70 @@ pymain_run_file(const PyConfig *config, PyCompilerFlags *cf)
static int
pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode)
{
+ int ret;
+ PyObject *startup_obj = NULL;
+ if (!config->use_environment) {
+ return 0;
+ }
+#ifdef MS_WINDOWS
+ const wchar_t *wstartup = _wgetenv(L"PYTHONSTARTUP");
+ if (wstartup == NULL || wstartup[0] == L'\0') {
+ return 0;
+ }
+ PyObject *startup_bytes = NULL;
+ startup_obj = PyUnicode_FromWideChar(wstartup, wcslen(wstartup));
+ if (startup_obj == NULL) {
+ goto error;
+ }
+ startup_bytes = PyUnicode_EncodeFSDefault(startup_obj);
+ if (startup_bytes == NULL) {
+ goto error;
+ }
+ const char *startup = PyBytes_AS_STRING(startup_bytes);
+#else
const char *startup = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP");
if (startup == NULL) {
return 0;
}
- PyObject *startup_obj = PyUnicode_DecodeFSDefault(startup);
+ startup_obj = PyUnicode_DecodeFSDefault(startup);
if (startup_obj == NULL) {
- return pymain_err_print(exitcode);
+ goto error;
}
+#endif
if (PySys_Audit("cpython.run_startup", "O", startup_obj) < 0) {
- Py_DECREF(startup_obj);
- return pymain_err_print(exitcode);
+ goto error;
}
- Py_DECREF(startup_obj);
+#ifdef MS_WINDOWS
+ FILE *fp = _Py_wfopen(wstartup, L"r");
+#else
FILE *fp = _Py_fopen(startup, "r");
+#endif
if (fp == NULL) {
int save_errno = errno;
PyErr_Clear();
PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
errno = save_errno;
- PyErr_SetFromErrnoWithFilename(PyExc_OSError, startup);
-
- return pymain_err_print(exitcode);
+ PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, startup_obj, NULL);
+ goto error;
}
(void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
PyErr_Clear();
fclose(fp);
- return 0;
+ ret = 0;
+
+done:
+#ifdef MS_WINDOWS
+ Py_XDECREF(startup_bytes);
+#endif
+ Py_XDECREF(startup_obj);
+ return ret;
+
+error:
+ ret = pymain_err_print(exitcode);
+ goto done;
}