diff options
author | Steve Dower <steve.dower@python.org> | 2020-07-06 16:32:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-06 16:32:00 (GMT) |
commit | dcbaa1b49cd9062fb9ba2b9d49555ac6cd8c60b5 (patch) | |
tree | 4b1d3d5130de1db92de3240f4decc656ee7247ef /Modules/_testinternalcapi.c | |
parent | deb016224cc506503fb05e821a60158c83918ed4 (diff) | |
download | cpython-dcbaa1b49cd9062fb9ba2b9d49555ac6cd8c60b5.zip cpython-dcbaa1b49cd9062fb9ba2b9d49555ac6cd8c60b5.tar.gz cpython-dcbaa1b49cd9062fb9ba2b9d49555ac6cd8c60b5.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
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 ad74af8..f08bf8d 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; } |