Commit 33354476 authored by Victor Stinner's avatar Victor Stinner

Check for PyUnicode_AS_UNICODE() failure

parent 53b33e76
...@@ -1472,12 +1472,15 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size) ...@@ -1472,12 +1472,15 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
/* create a BSTR from value */ /* create a BSTR from value */
if (value) { if (value) {
Py_ssize_t size = PyUnicode_GET_SIZE(value); Py_ssize_t size = PyUnicode_GET_SIZE(value);
wchar_t* wvalue;
if ((unsigned) size != size) { if ((unsigned) size != size) {
PyErr_SetString(PyExc_ValueError, "String too long for BSTR"); PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
return NULL; return NULL;
} }
bstr = SysAllocStringLen(PyUnicode_AS_UNICODE(value), wvalue = PyUnicode_AsUnicode(value);
(unsigned)size); if (wvalue == NULL)
return NULL;
bstr = SysAllocStringLen(wvalue, (unsigned)size);
Py_DECREF(value); Py_DECREF(value);
} else } else
bstr = NULL; bstr = NULL;
......
...@@ -417,6 +417,7 @@ sp_CreateProcess(PyObject* self, PyObject* args) ...@@ -417,6 +417,7 @@ sp_CreateProcess(PyObject* self, PyObject* args)
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
STARTUPINFOW si; STARTUPINFOW si;
PyObject* environment; PyObject* environment;
wchar_t *wenvironment;
Py_UNICODE* application_name; Py_UNICODE* application_name;
Py_UNICODE* command_line; Py_UNICODE* command_line;
...@@ -461,6 +462,17 @@ sp_CreateProcess(PyObject* self, PyObject* args) ...@@ -461,6 +462,17 @@ sp_CreateProcess(PyObject* self, PyObject* args)
return NULL; return NULL;
} }
if (environment) {
wenvironment = PyUnicode_AsUnicode(environment)
if (wenvironment == NULL)
{
Py_XDECREF(environment);
return NULL;
}
}
else
wenvironment = NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
result = CreateProcessW(application_name, result = CreateProcessW(application_name,
command_line, command_line,
...@@ -468,7 +480,7 @@ sp_CreateProcess(PyObject* self, PyObject* args) ...@@ -468,7 +480,7 @@ sp_CreateProcess(PyObject* self, PyObject* args)
NULL, NULL,
inherit_handles, inherit_handles,
creation_flags | CREATE_UNICODE_ENVIRONMENT, creation_flags | CREATE_UNICODE_ENVIRONMENT,
environment ? PyUnicode_AS_UNICODE(environment) : NULL, wenvironment,
current_directory, current_directory,
&si, &si,
&pi); &pi);
......
...@@ -35,6 +35,7 @@ _PyWin_FindRegisteredModule(PyObject *moduleName, ...@@ -35,6 +35,7 @@ _PyWin_FindRegisteredModule(PyObject *moduleName,
wchar_t pathBuf[MAXPATHLEN+1]; wchar_t pathBuf[MAXPATHLEN+1];
int pathLen = MAXPATHLEN+1; int pathLen = MAXPATHLEN+1;
PyObject *path, *moduleKey, *suffix; PyObject *path, *moduleKey, *suffix;
wchar_t *wmoduleKey, *wsuffix;
struct filedescr *fdp; struct filedescr *fdp;
HKEY keyBase; HKEY keyBase;
int modNameSize; int modNameSize;
...@@ -52,17 +53,22 @@ _PyWin_FindRegisteredModule(PyObject *moduleName, ...@@ -52,17 +53,22 @@ _PyWin_FindRegisteredModule(PyObject *moduleName,
PyWin_DLLVersionString, moduleName); PyWin_DLLVersionString, moduleName);
if (moduleKey == NULL) if (moduleKey == NULL)
return NULL; return NULL;
wmoduleKey = PyUnicode_AsUnicode(moduleKey);
if (wmoduleKey == NULL) {
Py_DECREF(moduleKey);
return NULL;
}
keyBase = HKEY_CURRENT_USER; keyBase = HKEY_CURRENT_USER;
modNameSize = pathLen; modNameSize = pathLen;
regStat = RegQueryValueW(keyBase, PyUnicode_AS_UNICODE(moduleKey), regStat = RegQueryValueW(keyBase, wmoduleKey,
pathBuf, &modNameSize); pathBuf, &modNameSize);
if (regStat != ERROR_SUCCESS) { if (regStat != ERROR_SUCCESS) {
/* No user setting - lookup in machine settings */ /* No user setting - lookup in machine settings */
keyBase = HKEY_LOCAL_MACHINE; keyBase = HKEY_LOCAL_MACHINE;
/* be anal - failure may have reset size param */ /* be anal - failure may have reset size param */
modNameSize = pathLen; modNameSize = pathLen;
regStat = RegQueryValueW(keyBase, PyUnicode_AS_UNICODE(moduleKey), regStat = RegQueryValueW(keyBase, wmoduleKey,
pathBuf, &modNameSize); pathBuf, &modNameSize);
if (regStat != ERROR_SUCCESS) { if (regStat != ERROR_SUCCESS) {
Py_DECREF(moduleKey); Py_DECREF(moduleKey);
...@@ -80,10 +86,15 @@ _PyWin_FindRegisteredModule(PyObject *moduleName, ...@@ -80,10 +86,15 @@ _PyWin_FindRegisteredModule(PyObject *moduleName,
suffix = PyUnicode_FromString(fdp->suffix); suffix = PyUnicode_FromString(fdp->suffix);
if (suffix == NULL) if (suffix == NULL)
return NULL; return NULL;
wsuffix = PyUnicode_AsUnicode(suffix);
if (wsuffix == NULL) {
Py_DECREF(suffix);
return NULL;
}
extLen = PyUnicode_GET_SIZE(suffix); extLen = PyUnicode_GET_SIZE(suffix);
if ((Py_ssize_t)modNameSize > extLen && if ((Py_ssize_t)modNameSize > extLen &&
_wcsnicmp(pathBuf + ((Py_ssize_t)modNameSize-extLen-1), _wcsnicmp(pathBuf + ((Py_ssize_t)modNameSize-extLen-1),
PyUnicode_AS_UNICODE(suffix), wsuffix,
extLen) == 0) extLen) == 0)
{ {
Py_DECREF(suffix); Py_DECREF(suffix);
......
...@@ -176,11 +176,16 @@ dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, ...@@ -176,11 +176,16 @@ dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname,
{ {
dl_funcptr p; dl_funcptr p;
char funcname[258], *import_python; char funcname[258], *import_python;
wchar_t *wpathname;
#ifndef _DEBUG #ifndef _DEBUG
_Py_CheckPython3(); _Py_CheckPython3();
#endif #endif
wpathname = PyUnicode_AsUnicode(pathname);
if (wpathname == NULL)
return NULL;
PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname); PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname);
{ {
...@@ -195,7 +200,7 @@ dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, ...@@ -195,7 +200,7 @@ dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname,
/* We use LoadLibraryEx so Windows looks for dependent DLLs /* We use LoadLibraryEx so Windows looks for dependent DLLs
in directory of pathname first. */ in directory of pathname first. */
/* XXX This call doesn't exist in Windows CE */ /* XXX This call doesn't exist in Windows CE */
hDLL = LoadLibraryExW(PyUnicode_AS_UNICODE(pathname), NULL, hDLL = LoadLibraryExW(wpathname, NULL,
LOAD_WITH_ALTERED_SEARCH_PATH); LOAD_WITH_ALTERED_SEARCH_PATH);
_Py_DeactivateActCtx(cookie); _Py_DeactivateActCtx(cookie);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment