Check for PyUnicode_AS_UNICODE() failure
This commit is contained in:
parent
53b33e767d
commit
3335447646
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
/* 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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user