mirror of https://github.com/python/cpython
bpo-35890 : Fix some API calling consistency (GH-11742)
Unicode version of Windows APIs are used in places, but not for GetVersionEx in Python/sysmodule.c The wcstok_s is called on Windows in Modules/main.c and PC/launcher.c, but not in Python/pathconfig.c
This commit is contained in:
parent
4c70d9f79c
commit
8ebc6451f3
|
@ -0,0 +1 @@
|
||||||
|
Fix API calling consistency of GetVersionEx and wcstok.
|
|
@ -675,6 +675,12 @@ _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
#define WCSTOK wcstok_s
|
||||||
|
#else
|
||||||
|
#define WCSTOK wcstok
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Search for a prefix value in an environment file (pyvenv.cfg).
|
/* Search for a prefix value in an environment file (pyvenv.cfg).
|
||||||
If found, copy it into the provided buffer. */
|
If found, copy it into the provided buffer. */
|
||||||
int
|
int
|
||||||
|
@ -705,11 +711,11 @@ _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key,
|
||||||
wchar_t *tmpbuffer = _Py_DecodeUTF8_surrogateescape(buffer, n);
|
wchar_t *tmpbuffer = _Py_DecodeUTF8_surrogateescape(buffer, n);
|
||||||
if (tmpbuffer) {
|
if (tmpbuffer) {
|
||||||
wchar_t * state;
|
wchar_t * state;
|
||||||
wchar_t * tok = wcstok(tmpbuffer, L" \t\r\n", &state);
|
wchar_t * tok = WCSTOK(tmpbuffer, L" \t\r\n", &state);
|
||||||
if ((tok != NULL) && !wcscmp(tok, key)) {
|
if ((tok != NULL) && !wcscmp(tok, key)) {
|
||||||
tok = wcstok(NULL, L" \t", &state);
|
tok = WCSTOK(NULL, L" \t", &state);
|
||||||
if ((tok != NULL) && !wcscmp(tok, L"=")) {
|
if ((tok != NULL) && !wcscmp(tok, L"=")) {
|
||||||
tok = wcstok(NULL, L"\r\n", &state);
|
tok = WCSTOK(NULL, L"\r\n", &state);
|
||||||
if (tok != NULL) {
|
if (tok != NULL) {
|
||||||
wcsncpy(value, tok, MAXPATHLEN);
|
wcsncpy(value, tok, MAXPATHLEN);
|
||||||
result = 1;
|
result = 1;
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ sys_getwindowsversion_impl(PyObject *module)
|
||||||
{
|
{
|
||||||
PyObject *version;
|
PyObject *version;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
OSVERSIONINFOEX ver;
|
OSVERSIONINFOEXW ver;
|
||||||
DWORD realMajor, realMinor, realBuild;
|
DWORD realMajor, realMinor, realBuild;
|
||||||
HANDLE hKernel32;
|
HANDLE hKernel32;
|
||||||
wchar_t kernel32_path[MAX_PATH];
|
wchar_t kernel32_path[MAX_PATH];
|
||||||
|
@ -1134,7 +1134,7 @@ sys_getwindowsversion_impl(PyObject *module)
|
||||||
DWORD verblock_size;
|
DWORD verblock_size;
|
||||||
|
|
||||||
ver.dwOSVersionInfoSize = sizeof(ver);
|
ver.dwOSVersionInfoSize = sizeof(ver);
|
||||||
if (!GetVersionEx((OSVERSIONINFO*) &ver))
|
if (!GetVersionExW((OSVERSIONINFOW*) &ver))
|
||||||
return PyErr_SetFromWindowsErr(0);
|
return PyErr_SetFromWindowsErr(0);
|
||||||
|
|
||||||
version = PyStructSequence_New(&WindowsVersionType);
|
version = PyStructSequence_New(&WindowsVersionType);
|
||||||
|
@ -1145,7 +1145,7 @@ sys_getwindowsversion_impl(PyObject *module)
|
||||||
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion));
|
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion));
|
||||||
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber));
|
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber));
|
||||||
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId));
|
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId));
|
||||||
PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromString(ver.szCSDVersion));
|
PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromWideChar(ver.szCSDVersion, -1));
|
||||||
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor));
|
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor));
|
||||||
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor));
|
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor));
|
||||||
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask));
|
PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask));
|
||||||
|
|
Loading…
Reference in New Issue