summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/_ctypes/cfield.c7
-rw-r--r--PC/_subprocess.c14
-rw-r--r--PC/import_nt.c17
-rw-r--r--Python/dynload_win.c7
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);