diff options
| author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2020-07-06 16:52:13 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-06 16:52:13 (GMT) |
| commit | 4981fe36c7477303de830e8dca929a02caaaffe4 (patch) | |
| tree | 9cc8650723264730f4a58ac02126c824f0f54275 /Modules/_testinternalcapi.c | |
| parent | 97558d6b08a656eae209d49b206f703cee0359a2 (diff) | |
| download | cpython-4981fe36c7477303de830e8dca929a02caaaffe4.zip cpython-4981fe36c7477303de830e8dca929a02caaaffe4.tar.gz cpython-4981fe36c7477303de830e8dca929a02caaaffe4.tar.bz2 | |
bpo-29778: Ensure python3.dll is loaded from correct locations when Python is embedded (GH-21297)
Also enables using debug build of `python3_d.dll`
Reference: CVE-2020-15523
(cherry picked from commit dcbaa1b49cd9062fb9ba2b9d49555ac6cd8c60b5)
Co-authored-by: Steve Dower <steve.dower@python.org>
Diffstat (limited to 'Modules/_testinternalcapi.c')
| -rw-r--r-- | Modules/_testinternalcapi.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 8faa9fe..4445d2e 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -18,10 +18,53 @@ #include "pycore_gc.h" // PyGC_Head +#ifdef MS_WINDOWS +#include <windows.h> + +static int +_add_windows_config(PyObject *configs) +{ + HMODULE hPython3; + wchar_t py3path[MAX_PATH]; + PyObject *dict = PyDict_New(); + PyObject *obj = NULL; + if (!dict) { + return -1; + } + + hPython3 = GetModuleHandleW(PY3_DLLNAME); + if (hPython3 && GetModuleFileNameW(hPython3, py3path, MAX_PATH)) { + obj = PyUnicode_FromWideChar(py3path, -1); + } else { + obj = Py_None; + Py_INCREF(obj); + } + if (obj && + !PyDict_SetItemString(dict, "python3_dll", obj) && + !PyDict_SetItemString(configs, "windows", dict)) { + Py_DECREF(obj); + Py_DECREF(dict); + return 0; + } + Py_DECREF(obj); + Py_DECREF(dict); + return -1; +} +#endif + + static PyObject * get_configs(PyObject *self, PyObject *Py_UNUSED(args)) { - return _Py_GetConfigsAsDict(); + PyObject *dict = _Py_GetConfigsAsDict(); +#ifdef MS_WINDOWS + if (dict) { + if (_add_windows_config(dict) < 0) { + Py_CLEAR(dict); + } + } +#endif + return dict; } |
