summaryrefslogtreecommitdiffstats
path: root/Modules/_testinternalcapi.c
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2020-07-06 16:32:00 (GMT)
committerGitHub <noreply@github.com>2020-07-06 16:32:00 (GMT)
commitdcbaa1b49cd9062fb9ba2b9d49555ac6cd8c60b5 (patch)
tree4b1d3d5130de1db92de3240f4decc656ee7247ef /Modules/_testinternalcapi.c
parentdeb016224cc506503fb05e821a60158c83918ed4 (diff)
downloadcpython-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.c45
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;
}