402 lines
12 KiB
Diff
402 lines
12 KiB
Diff
diff -Naur Python-3.8.0-orig/Include/pylifecycle.h Python-3.8.0/Include/pylifecycle.h
|
|
--- Python-3.8.0-orig/Include/pylifecycle.h 2019-10-22 10:02:41.276120000 +0300
|
|
+++ Python-3.8.0/Include/pylifecycle.h 2019-10-22 10:02:44.427325500 +0300
|
|
@@ -53,7 +53,7 @@
|
|
PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void);
|
|
PyAPI_FUNC(wchar_t *) Py_GetPath(void);
|
|
PyAPI_FUNC(void) Py_SetPath(const wchar_t *);
|
|
-#ifdef MS_WINDOWS
|
|
+#ifdef _MSC_VER
|
|
int _Py_CheckPython3(void);
|
|
#endif
|
|
|
|
diff -Naur Python-3.8.0-orig/Modules/getpath.c Python-3.8.0/Modules/getpath.c
|
|
--- Python-3.8.0-orig/Modules/getpath.c 2019-10-14 16:34:47.000000000 +0300
|
|
+++ Python-3.8.0/Modules/getpath.c 2019-10-22 10:02:44.848526300 +0300
|
|
@@ -14,6 +14,11 @@
|
|
# include <mach-o/dyld.h>
|
|
#endif
|
|
|
|
+#ifdef MS_WINDOWS
|
|
+#include <windows.h>
|
|
+#include <shlwapi.h>
|
|
+#endif
|
|
+
|
|
/* Search in some common locations for the associated Python libraries.
|
|
*
|
|
* Two directories must be found, the platform independent directory
|
|
@@ -132,13 +137,39 @@
|
|
int prefix_found; /* found platform independent libraries? */
|
|
int exec_prefix_found; /* found the platform dependent libraries? */
|
|
|
|
+ wchar_t *dll_path;
|
|
int warnings;
|
|
const wchar_t *pythonpath_env;
|
|
} PyCalculatePath;
|
|
|
|
static const wchar_t delimiter[2] = {DELIM, '\0'};
|
|
-static const wchar_t separator[2] = {SEP, '\0'};
|
|
+static wchar_t separator[2] = {SEP, '\0'};
|
|
|
|
+static int
|
|
+is_sep(wchar_t ch)
|
|
+{
|
|
+#ifdef _WIN32
|
|
+ return ch == SEP || ch == ALTSEP;
|
|
+#else
|
|
+ return ch == SEP;
|
|
+#endif
|
|
+}
|
|
+
|
|
+static int
|
|
+is_absolute(const wchar_t *path)
|
|
+{
|
|
+#ifdef _WIN32
|
|
+ size_t i = wcslen(path);
|
|
+ if (i >= 3) {
|
|
+ if (iswalpha(path[0]) && path[1] == L':' && is_sep(path[2])) {
|
|
+ return 1;
|
|
+ }
|
|
+ }
|
|
+ return 0;
|
|
+#else
|
|
+ return path[0] == SEP;
|
|
+#endif
|
|
+}
|
|
|
|
/* Get file status. Encode the path to the locale encoding. */
|
|
static int
|
|
@@ -161,7 +192,7 @@
|
|
reduce(wchar_t *dir)
|
|
{
|
|
size_t i = wcslen(dir);
|
|
- while (i > 0 && dir[i] != SEP) {
|
|
+ while (i > 0 && !is_sep(dir[i])) {
|
|
--i;
|
|
}
|
|
dir[i] = '\0';
|
|
@@ -241,14 +272,14 @@
|
|
joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen)
|
|
{
|
|
size_t n, k;
|
|
- if (stuff[0] != SEP) {
|
|
+ if (!is_sep(stuff[0])) {
|
|
n = wcslen(buffer);
|
|
if (n >= buflen) {
|
|
return PATHLEN_ERR();
|
|
}
|
|
|
|
- if (n > 0 && buffer[n-1] != SEP) {
|
|
- buffer[n++] = SEP;
|
|
+ if (n > 0 && !is_sep(buffer[n-1]) != SEP) {
|
|
+ buffer[n++] = Py_GetSepW(buffer);
|
|
}
|
|
}
|
|
else {
|
|
@@ -284,7 +315,7 @@
|
|
static PyStatus
|
|
copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen)
|
|
{
|
|
- if (p[0] == SEP) {
|
|
+ if (is_absolute(p)) {
|
|
if (safe_wcscpy(path, p, pathlen) < 0) {
|
|
return PATHLEN_ERR();
|
|
}
|
|
@@ -297,7 +328,7 @@
|
|
}
|
|
return _PyStatus_OK();
|
|
}
|
|
- if (p[0] == '.' && p[1] == SEP) {
|
|
+ if (p[0] == '.' && is_sep(p[1])) {
|
|
p += 2;
|
|
}
|
|
PyStatus status = joinpath(path, p, pathlen);
|
|
@@ -313,7 +344,7 @@
|
|
static PyStatus
|
|
absolutize(wchar_t *path, size_t path_len)
|
|
{
|
|
- if (path[0] == SEP) {
|
|
+ if (is_absolute(path)) {
|
|
return _PyStatus_OK();
|
|
}
|
|
|
|
@@ -403,6 +434,7 @@
|
|
return status;
|
|
}
|
|
|
|
+ Py_NormalizeSepsW(path);
|
|
if (isfile(path)) {
|
|
/* Check VPATH to see if argv0_path is in the build directory.
|
|
VPATH can be empty. */
|
|
@@ -427,6 +459,7 @@
|
|
return status;
|
|
}
|
|
|
|
+ Py_NormalizeSepsW(prefix);
|
|
if (ismodule(prefix, prefix_len)) {
|
|
*found = -1;
|
|
reduce(prefix);
|
|
@@ -529,12 +562,21 @@
|
|
* return the compiled-in defaults instead.
|
|
*/
|
|
if (calculate->prefix_found > 0) {
|
|
+#ifdef _WIN32
|
|
+ wchar_t drive_root[3];
|
|
+ memset(drive_root, 0, sizeof(drive_root));
|
|
+ wcsncpy(drive_root, prefix, 3);
|
|
+#endif
|
|
reduce(prefix);
|
|
reduce(prefix);
|
|
/* The prefix is the root directory, but reduce() chopped
|
|
* off the "/". */
|
|
if (!prefix[0]) {
|
|
+#ifdef _WIN32
|
|
+ wcsncpy(prefix, drive_root, 3);
|
|
+#else
|
|
wcscpy(prefix, separator);
|
|
+#endif
|
|
}
|
|
pathconfig->prefix = _PyMem_RawWcsdup(prefix);
|
|
}
|
|
@@ -649,6 +691,7 @@
|
|
|
|
/* Check for pybuilddir.txt */
|
|
assert(*found == 0);
|
|
+ Py_NormalizeSepsW(exec_prefix);
|
|
status = calculate_pybuilddir(argv0_path, exec_prefix, exec_prefix_len,
|
|
found);
|
|
if (_PyStatus_EXCEPTION(status)) {
|
|
@@ -734,6 +777,7 @@
|
|
if (_PyStatus_EXCEPTION(status)) {
|
|
return status;
|
|
}
|
|
+ Py_NormalizeSepsW(exec_prefix);
|
|
}
|
|
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
|
|
return _PyStatus_OK();
|
|
@@ -746,11 +790,20 @@
|
|
wchar_t *exec_prefix)
|
|
{
|
|
if (calculate->exec_prefix_found > 0) {
|
|
+#ifdef _WIN32
|
|
+ wchar_t drive_root[3];
|
|
+ memset(drive_root, 0, sizeof(drive_root));
|
|
+ wcsncpy(drive_root, exec_prefix, 3);
|
|
+#endif
|
|
reduce(exec_prefix);
|
|
reduce(exec_prefix);
|
|
reduce(exec_prefix);
|
|
if (!exec_prefix[0]) {
|
|
+#ifdef _WIN32
|
|
+ wcsncpy(exec_prefix, drive_root, 3);
|
|
+#else
|
|
wcscpy(exec_prefix, separator);
|
|
+#endif
|
|
}
|
|
|
|
pathconfig->exec_prefix = _PyMem_RawWcsdup(exec_prefix);
|
|
@@ -767,6 +820,48 @@
|
|
}
|
|
|
|
|
|
+#ifdef MS_WINDOWS
|
|
+static int
|
|
+GetWindowsModulePaths(wchar_t *progpath)
|
|
+{
|
|
+ int result = 0;
|
|
+ wchar_t program_full_path[MAXPATHLEN+1];
|
|
+ memset(program_full_path, 0, sizeof(program_full_path));
|
|
+
|
|
+ if (GetModuleFileNameW(NULL, program_full_path, MAXPATHLEN)) {
|
|
+ result = 1;
|
|
+ Py_NormalizeSepsW(program_full_path);
|
|
+ }
|
|
+
|
|
+ wcscpy(progpath, program_full_path);
|
|
+ return result;
|
|
+}
|
|
+
|
|
+
|
|
+wchar_t*
|
|
+_Py_GetDLLPath(void)
|
|
+{
|
|
+ wchar_t dll_path[MAXPATHLEN+1];
|
|
+ memset(dll_path, 0, sizeof(dll_path));
|
|
+
|
|
+#ifdef Py_ENABLE_SHARED
|
|
+ extern HANDLE PyWin_DLLhModule;
|
|
+ if (PyWin_DLLhModule) {
|
|
+ if (GetModuleFileNameW(PyWin_DLLhModule, dll_path, MAXPATHLEN)) {
|
|
+ Py_NormalizeSepsW(dll_path);
|
|
+ } else {
|
|
+ dll_path[0] = 0;
|
|
+ }
|
|
+ }
|
|
+#else
|
|
+ dll_path[0] = 0;
|
|
+#endif
|
|
+
|
|
+ return _PyMem_RawWcsdup(dll_path);
|
|
+}
|
|
+#endif /* MS_WINDOWS */
|
|
+
|
|
+
|
|
static PyStatus
|
|
calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig)
|
|
{
|
|
@@ -789,7 +884,7 @@
|
|
* other way to find a directory to start the search from. If
|
|
* $PATH isn't exported, you lose.
|
|
*/
|
|
- if (wcschr(pathconfig->program_name, SEP)) {
|
|
+ if (wcschr(pathconfig->program_name, Py_GetSepW(pathconfig->program_name))) {
|
|
if (safe_wcscpy(program_full_path, pathconfig->program_name,
|
|
program_full_path_len) < 0) {
|
|
return PATHLEN_ERR();
|
|
@@ -821,6 +916,10 @@
|
|
PyMem_RawFree(path);
|
|
}
|
|
#endif /* __APPLE__ */
|
|
+#ifdef MS_WINDOWS
|
|
+ else if(GetWindowsModulePaths(program_full_path)) {
|
|
+ }
|
|
+#endif /* MS_WINDOWS */
|
|
else if (calculate->path_env) {
|
|
wchar_t *path = calculate->path_env;
|
|
while (1) {
|
|
@@ -861,7 +960,7 @@
|
|
else {
|
|
program_full_path[0] = '\0';
|
|
}
|
|
- if (program_full_path[0] != SEP && program_full_path[0] != '\0') {
|
|
+ if (!is_absolute(program_full_path)) {
|
|
status = absolutize(program_full_path, program_full_path_len);
|
|
if (_PyStatus_EXCEPTION(status)) {
|
|
return status;
|
|
@@ -1071,6 +1170,7 @@
|
|
if (_PyStatus_EXCEPTION(status)) {
|
|
return status;
|
|
}
|
|
+ Py_NormalizeSepsW(zip_path);
|
|
|
|
/* Replace "00" with version */
|
|
size_t bufsz = wcslen(zip_path);
|
|
@@ -1098,7 +1198,7 @@
|
|
while (1) {
|
|
wchar_t *delim = wcschr(defpath, DELIM);
|
|
|
|
- if (defpath[0] != SEP) {
|
|
+ if (!is_absolute(defpath)) {
|
|
/* Paths are relative to prefix */
|
|
bufsz += prefixsz;
|
|
}
|
|
@@ -1115,6 +1215,11 @@
|
|
|
|
bufsz += wcslen(zip_path) + 1;
|
|
bufsz += wcslen(exec_prefix) + 1;
|
|
+#ifdef MS_WINDOWS
|
|
+ if (is_absolute(prefix)) {
|
|
+ bufsz += wcslen(prefix) + 1;
|
|
+ }
|
|
+#endif
|
|
|
|
/* Allocate the buffer */
|
|
wchar_t *buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t));
|
|
@@ -1140,9 +1245,9 @@
|
|
while (1) {
|
|
wchar_t *delim = wcschr(defpath, DELIM);
|
|
|
|
- if (defpath[0] != SEP) {
|
|
+ if (!is_absolute(defpath)) {
|
|
wcscat(buf, prefix);
|
|
- if (prefixsz >= 2 && prefix[prefixsz - 2] != SEP &&
|
|
+ if (prefixsz >= 2 && !is_sep(prefix[prefixsz - 2]) &&
|
|
defpath[0] != (delim ? DELIM : L'\0'))
|
|
{
|
|
/* not empty */
|
|
@@ -1163,6 +1268,12 @@
|
|
defpath = delim + 1;
|
|
}
|
|
wcscat(buf, delimiter);
|
|
+#ifdef MS_WINDOWS
|
|
+ if (is_absolute(prefix)) {
|
|
+ wcscat(buf, prefix);
|
|
+ wcscat(buf, delimiter);
|
|
+ }
|
|
+#endif
|
|
|
|
/* Finally, on goes the directory for dynamic-load modules */
|
|
wcscat(buf, exec_prefix);
|
|
@@ -1188,16 +1299,20 @@
|
|
if (!calculate->pythonpath) {
|
|
return DECODE_LOCALE_ERR("PYTHONPATH define", len);
|
|
}
|
|
+ Py_NormalizeSepsW(calculate->pythonpath);
|
|
|
|
calculate->prefix = Py_DecodeLocale(PREFIX, &len);
|
|
if (!calculate->prefix) {
|
|
return DECODE_LOCALE_ERR("PREFIX define", len);
|
|
}
|
|
+ Py_NormalizeSepsW(calculate->prefix);
|
|
calculate->exec_prefix = Py_DecodeLocale(EXEC_PREFIX, &len);
|
|
if (!calculate->exec_prefix) {
|
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
|
}
|
|
- calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len);
|
|
+ Py_NormalizeSepsW(calculate->exec_prefix);
|
|
+ const char *lib_python_VERSION = (Py_GetSepW(NULL) == L'/') ? "lib/python" VERSION : "lib\\python" VERSION;
|
|
+ calculate->lib_python = Py_DecodeLocale(lib_python_VERSION, &len);
|
|
if (!calculate->lib_python) {
|
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
|
}
|
|
@@ -1215,6 +1330,7 @@
|
|
PyMem_RawFree(calculate->pythonpath);
|
|
PyMem_RawFree(calculate->prefix);
|
|
PyMem_RawFree(calculate->exec_prefix);
|
|
+ PyMem_RawFree(calculate->dll_path);
|
|
PyMem_RawFree(calculate->lib_python);
|
|
PyMem_RawFree(calculate->path_env);
|
|
}
|
|
@@ -1225,6 +1341,8 @@
|
|
{
|
|
PyStatus status;
|
|
|
|
+ calculate->dll_path = _Py_GetDLLPath();
|
|
+
|
|
if (pathconfig->program_full_path == NULL) {
|
|
status = calculate_program_full_path(calculate, pathconfig);
|
|
if (_PyStatus_EXCEPTION(status)) {
|
|
@@ -1343,6 +1461,7 @@
|
|
{
|
|
PyStatus status;
|
|
PyCalculatePath calculate;
|
|
+ separator[0] = Py_GetSepW(NULL);
|
|
memset(&calculate, 0, sizeof(calculate));
|
|
|
|
status = calculate_init(&calculate, config);
|
|
diff -Naur Python-3.8.0-orig/Modules/posixmodule.c Python-3.8.0/Modules/posixmodule.c
|
|
--- Python-3.8.0-orig/Modules/posixmodule.c 2019-10-22 10:02:42.087321400 +0300
|
|
+++ Python-3.8.0/Modules/posixmodule.c 2019-10-22 10:02:45.238527000 +0300
|
|
@@ -3691,7 +3691,7 @@
|
|
Py_END_ALLOW_THREADS
|
|
/* FindNextFile sets error to ERROR_NO_MORE_FILES if
|
|
it got to the end of the directory. */
|
|
- if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
|
|
+ if (!result && GetLastError() != 0 && GetLastError() != ERROR_NO_MORE_FILES) {
|
|
Py_DECREF(list);
|
|
list = path_error(path);
|
|
goto exit;
|
|
diff -Naur Python-3.8.4-orig/Python/dynload_win.c Python-3.8.4/Python/dynload_win.c
|
|
--- Python-3.8.4-orig/Python/dynload_win.c 2019-10-22 10:01:24.710185500 +0300
|
|
+++ Python-3.8.4/Python/dynload_win.c 2019-10-22 10:02:45.644127700 +0300
|
|
@@ -180,7 +180,9 @@
|
|
char funcname[258], *import_python;
|
|
const wchar_t *wpathname;
|
|
|
|
+#if defined(_MSC_VER)
|
|
_Py_CheckPython3();
|
|
+#endif
|
|
|
|
wpathname = _PyUnicode_AsUnicode(pathname);
|
|
if (wpathname == NULL)
|