From 333544764619b8e338b7485ea94b9be9b9e75a9d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 21 Nov 2011 02:01:41 +0100 Subject: Check for PyUnicode_AS_UNICODE() failure --- Modules/_ctypes/cfield.c | 7 +++++-- PC/_subprocess.c | 14 +++++++++++++- PC/import_nt.c | 17 ++++++++++++++--- Python/dynload_win.c | 7 ++++++- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index d324ca9..6cf311f 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1472,12 +1472,15 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size) /* create a BSTR from value */ if (value) { Py_ssize_t size = PyUnicode_GET_SIZE(value); + wchar_t* wvalue; if ((unsigned) size != size) { PyErr_SetString(PyExc_ValueError, "String too long for BSTR"); return NULL; } - bstr = SysAllocStringLen(PyUnicode_AS_UNICODE(value), - (unsigned)size); + wvalue = PyUnicode_AsUnicode(value); + if (wvalue == NULL) + return NULL; + bstr = SysAllocStringLen(wvalue, (unsigned)size); Py_DECREF(value); } else bstr = NULL; diff --git a/PC/_subprocess.c b/PC/_subprocess.c index f0ad559..ec93d25 100644 --- a/PC/_subprocess.c +++ b/PC/_subprocess.c @@ -417,6 +417,7 @@ sp_CreateProcess(PyObject* self, PyObject* args) PROCESS_INFORMATION pi; STARTUPINFOW si; PyObject* environment; + wchar_t *wenvironment; Py_UNICODE* application_name; Py_UNICODE* command_line; @@ -461,6 +462,17 @@ sp_CreateProcess(PyObject* self, PyObject* args) return NULL; } + if (environment) { + wenvironment = PyUnicode_AsUnicode(environment) + if (wenvironment == NULL) + { + Py_XDECREF(environment); + return NULL; + } + } + else + wenvironment = NULL; + Py_BEGIN_ALLOW_THREADS result = CreateProcessW(application_name, command_line, @@ -468,7 +480,7 @@ sp_CreateProcess(PyObject* self, PyObject* args) NULL, inherit_handles, creation_flags | CREATE_UNICODE_ENVIRONMENT, - environment ? PyUnicode_AS_UNICODE(environment) : NULL, + wenvironment, current_directory, &si, &pi); diff --git a/PC/import_nt.c b/PC/import_nt.c index 3b60718..dfbf054 100644 --- a/PC/import_nt.c +++ b/PC/import_nt.c @@ -35,6 +35,7 @@ _PyWin_FindRegisteredModule(PyObject *moduleName, wchar_t pathBuf[MAXPATHLEN+1]; int pathLen = MAXPATHLEN+1; PyObject *path, *moduleKey, *suffix; + wchar_t *wmoduleKey, *wsuffix; struct filedescr *fdp; HKEY keyBase; int modNameSize; @@ -52,17 +53,22 @@ _PyWin_FindRegisteredModule(PyObject *moduleName, PyWin_DLLVersionString, moduleName); if (moduleKey == NULL) return NULL; + wmoduleKey = PyUnicode_AsUnicode(moduleKey); + if (wmoduleKey == NULL) { + Py_DECREF(moduleKey); + return NULL; + } keyBase = HKEY_CURRENT_USER; modNameSize = pathLen; - regStat = RegQueryValueW(keyBase, PyUnicode_AS_UNICODE(moduleKey), + regStat = RegQueryValueW(keyBase, wmoduleKey, pathBuf, &modNameSize); if (regStat != ERROR_SUCCESS) { /* No user setting - lookup in machine settings */ keyBase = HKEY_LOCAL_MACHINE; /* be anal - failure may have reset size param */ modNameSize = pathLen; - regStat = RegQueryValueW(keyBase, PyUnicode_AS_UNICODE(moduleKey), + regStat = RegQueryValueW(keyBase, wmoduleKey, pathBuf, &modNameSize); if (regStat != ERROR_SUCCESS) { Py_DECREF(moduleKey); @@ -80,10 +86,15 @@ _PyWin_FindRegisteredModule(PyObject *moduleName, suffix = PyUnicode_FromString(fdp->suffix); if (suffix == NULL) return NULL; + wsuffix = PyUnicode_AsUnicode(suffix); + if (wsuffix == NULL) { + Py_DECREF(suffix); + return NULL; + } extLen = PyUnicode_GET_SIZE(suffix); if ((Py_ssize_t)modNameSize > extLen && _wcsnicmp(pathBuf + ((Py_ssize_t)modNameSize-extLen-1), - PyUnicode_AS_UNICODE(suffix), + wsuffix, extLen) == 0) { Py_DECREF(suffix); diff --git a/Python/dynload_win.c b/Python/dynload_win.c index c620e58..e511098 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -176,11 +176,16 @@ dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, { dl_funcptr p; char funcname[258], *import_python; + wchar_t *wpathname; #ifndef _DEBUG _Py_CheckPython3(); #endif + wpathname = PyUnicode_AsUnicode(pathname); + if (wpathname == NULL) + return NULL; + 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 in directory of pathname first. */ /* 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); _Py_DeactivateActCtx(cookie); -- cgit v0.12