[Python-checkins] bpo-36356: Fix _PyCoreConfig_Read() (GH-12454)

Victor Stinner webhook-mailer at python.org
Tue Mar 19 22:11:43 EDT 2019


https://github.com/python/cpython/commit/4a1468e593c4b67d8c78b78070fff9e18ec5d790
commit: 4a1468e593c4b67d8c78b78070fff9e18ec5d790
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2019-03-20T03:11:38+01:00
summary:

bpo-36356: Fix _PyCoreConfig_Read() (GH-12454)

Don't override parameters which are already set by the user.

files:
M Python/coreconfig.c

diff --git a/Python/coreconfig.c b/Python/coreconfig.c
index de2058c0f342..e1d883c51cbf 100644
--- a/Python/coreconfig.c
+++ b/Python/coreconfig.c
@@ -961,13 +961,15 @@ config_read_env_vars(_PyCoreConfig *config)
         config->malloc_stats = 1;
     }
 
-    wchar_t *path;
-    int res = _PyCoreConfig_GetEnvDup(config, &path,
-                                      L"PYTHONPATH", "PYTHONPATH");
-    if (res < 0) {
-        return DECODE_LOCALE_ERR("PYTHONPATH", res);
+    if (config->module_search_path_env == NULL) {
+        wchar_t *path;
+        int res = _PyCoreConfig_GetEnvDup(config, &path,
+                                          L"PYTHONPATH", "PYTHONPATH");
+        if (res < 0) {
+            return DECODE_LOCALE_ERR("PYTHONPATH", res);
+        }
+        config->module_search_path_env = path;
     }
-    config->module_search_path_env = path;
 
     if (config->use_hash_seed < 0) {
         _PyInitError err = config_init_hash_seed(config);
@@ -1689,18 +1691,20 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
         }
 
         if (c == 'c') {
-            /* -c is the last option; following arguments
-               that look like options are left for the
-               command to interpret. */
-            size_t len = wcslen(_PyOS_optarg) + 1 + 1;
-            wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
-            if (command == NULL) {
-                return _Py_INIT_NO_MEMORY();
+            if (config->run_command == NULL) {
+                /* -c is the last option; following arguments
+                   that look like options are left for the
+                   command to interpret. */
+                size_t len = wcslen(_PyOS_optarg) + 1 + 1;
+                wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
+                if (command == NULL) {
+                    return _Py_INIT_NO_MEMORY();
+                }
+                memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t));
+                command[len - 2] = '\n';
+                command[len - 1] = 0;
+                config->run_command = command;
             }
-            memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t));
-            command[len - 2] = '\n';
-            command[len - 1] = 0;
-            config->run_command = command;
             break;
         }
 
@@ -1708,9 +1712,11 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
             /* -m is the last option; following arguments
                that look like options are left for the
                module to interpret. */
-            config->run_module = _PyMem_RawWcsdup(_PyOS_optarg);
             if (config->run_module == NULL) {
-                return _Py_INIT_NO_MEMORY();
+                config->run_module = _PyMem_RawWcsdup(_PyOS_optarg);
+                if (config->run_module == NULL) {
+                    return _Py_INIT_NO_MEMORY();
+                }
             }
             break;
         }
@@ -1825,7 +1831,8 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
 
     if (config->run_command == NULL && config->run_module == NULL
         && _PyOS_optind < cmdline->argv.length
-        && wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0)
+        && wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0
+        && config->run_filename == NULL)
     {
         config->run_filename = _PyMem_RawWcsdup(cmdline->argv.items[_PyOS_optind]);
         if (config->run_filename == NULL) {
@@ -2032,9 +2039,11 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,
 
     _PyCoreConfig_GetGlobalConfig(config);
 
-    err = config_init_program(config, cmdline);
-    if (_Py_INIT_FAILED(err)) {
-        return err;
+    if (config->program == NULL) {
+        err = config_init_program(config, cmdline);
+        if (_Py_INIT_FAILED(err)) {
+            return err;
+        }
     }
 
     err = config_parse_cmdline(config, cmdline, &need_usage);



More information about the Python-checkins mailing list