Issue #11619: _PyImport_LoadDynamicModule() doesn't encode the path to bytes
on Windows.
This commit is contained in:
parent
54e7135fe8
commit
2d3222740b
|
@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #11619: _PyImport_LoadDynamicModule() doesn't encode the path to bytes
|
||||||
|
on Windows.
|
||||||
|
|
||||||
- Issue #10998: Remove mentions of -Q, sys.flags.division_warning and
|
- Issue #10998: Remove mentions of -Q, sys.flags.division_warning and
|
||||||
Py_DivisionWarningFlag left over from Python 2.
|
Py_DivisionWarningFlag left over from Python 2.
|
||||||
|
|
||||||
|
|
|
@ -171,8 +171,8 @@ static char *GetPythonImport (HINSTANCE hModule)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname,
|
||||||
const char *pathname, FILE *fp)
|
PyObject *pathname, FILE *fp)
|
||||||
{
|
{
|
||||||
dl_funcptr p;
|
dl_funcptr p;
|
||||||
char funcname[258], *import_python;
|
char funcname[258], *import_python;
|
||||||
|
@ -185,8 +185,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
||||||
|
|
||||||
{
|
{
|
||||||
HINSTANCE hDLL = NULL;
|
HINSTANCE hDLL = NULL;
|
||||||
char pathbuf[260];
|
wchar_t pathbuf[260];
|
||||||
LPTSTR dummy;
|
|
||||||
unsigned int old_mode;
|
unsigned int old_mode;
|
||||||
ULONG_PTR cookie = 0;
|
ULONG_PTR cookie = 0;
|
||||||
/* We use LoadLibraryEx so Windows looks for dependent DLLs
|
/* We use LoadLibraryEx so Windows looks for dependent DLLs
|
||||||
|
@ -198,14 +197,14 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
||||||
/* Don't display a message box when Python can't load a DLL */
|
/* Don't display a message box when Python can't load a DLL */
|
||||||
old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
||||||
|
|
||||||
if (GetFullPathName(pathname,
|
if (GetFullPathNameW(PyUnicode_AS_UNICODE(pathname),
|
||||||
sizeof(pathbuf),
|
sizeof(pathbuf) / sizeof(pathbuf[0]),
|
||||||
pathbuf,
|
pathbuf,
|
||||||
&dummy)) {
|
NULL)) {
|
||||||
ULONG_PTR cookie = _Py_ActivateActCtx();
|
ULONG_PTR cookie = _Py_ActivateActCtx();
|
||||||
/* XXX This call doesn't exist in Windows CE */
|
/* XXX This call doesn't exist in Windows CE */
|
||||||
hDLL = LoadLibraryEx(pathname, NULL,
|
hDLL = LoadLibraryExW(PyUnicode_AS_UNICODE(pathname), NULL,
|
||||||
LOAD_WITH_ALTERED_SEARCH_PATH);
|
LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||||
_Py_DeactivateActCtx(cookie);
|
_Py_DeactivateActCtx(cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,21 +263,21 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
||||||
} else {
|
} else {
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
|
|
||||||
|
PyOS_snprintf(buffer, sizeof(buffer),
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
PyOS_snprintf(buffer, sizeof(buffer), "python%d%d_d.dll",
|
"python%d%d_d.dll",
|
||||||
#else
|
#else
|
||||||
PyOS_snprintf(buffer, sizeof(buffer), "python%d%d.dll",
|
"python%d%d.dll",
|
||||||
#endif
|
#endif
|
||||||
PY_MAJOR_VERSION,PY_MINOR_VERSION);
|
PY_MAJOR_VERSION,PY_MINOR_VERSION);
|
||||||
import_python = GetPythonImport(hDLL);
|
import_python = GetPythonImport(hDLL);
|
||||||
|
|
||||||
if (import_python &&
|
if (import_python &&
|
||||||
strcasecmp(buffer,import_python)) {
|
strcasecmp(buffer,import_python)) {
|
||||||
PyOS_snprintf(buffer, sizeof(buffer),
|
PyErr_Format(PyExc_ImportError,
|
||||||
"Module use of %.150s conflicts "
|
"Module use of %.150s conflicts "
|
||||||
"with this version of Python.",
|
"with this version of Python.",
|
||||||
import_python);
|
import_python);
|
||||||
PyErr_SetString(PyExc_ImportError,buffer);
|
|
||||||
FreeLibrary(hDLL);
|
FreeLibrary(hDLL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,13 @@
|
||||||
|
|
||||||
#include "importdl.h"
|
#include "importdl.h"
|
||||||
|
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
extern dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname,
|
||||||
|
PyObject *pathname, FILE *fp);
|
||||||
|
#else
|
||||||
extern dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
extern dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
||||||
const char *pathname, FILE *fp);
|
const char *pathname, FILE *fp);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* name should be ASCII only because the C language doesn't accept non-ASCII
|
/* name should be ASCII only because the C language doesn't accept non-ASCII
|
||||||
identifiers, and dynamic modules are written in C. */
|
identifiers, and dynamic modules are written in C. */
|
||||||
|
@ -22,7 +27,9 @@ PyObject *
|
||||||
_PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)
|
_PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)
|
||||||
{
|
{
|
||||||
PyObject *m;
|
PyObject *m;
|
||||||
|
#ifndef MS_WINDOWS
|
||||||
PyObject *pathbytes;
|
PyObject *pathbytes;
|
||||||
|
#endif
|
||||||
char *namestr, *lastdot, *shortname, *packagecontext, *oldcontext;
|
char *namestr, *lastdot, *shortname, *packagecontext, *oldcontext;
|
||||||
dl_funcptr p0;
|
dl_funcptr p0;
|
||||||
PyObject* (*p)(void);
|
PyObject* (*p)(void);
|
||||||
|
@ -48,12 +55,16 @@ _PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)
|
||||||
shortname = lastdot+1;
|
shortname = lastdot+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
p0 = _PyImport_GetDynLoadWindows(shortname, path, fp);
|
||||||
|
#else
|
||||||
pathbytes = PyUnicode_EncodeFSDefault(path);
|
pathbytes = PyUnicode_EncodeFSDefault(path);
|
||||||
if (pathbytes == NULL)
|
if (pathbytes == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
p0 = _PyImport_GetDynLoadFunc(shortname,
|
p0 = _PyImport_GetDynLoadFunc(shortname,
|
||||||
PyBytes_AS_STRING(pathbytes), fp);
|
PyBytes_AS_STRING(pathbytes), fp);
|
||||||
Py_DECREF(pathbytes);
|
Py_DECREF(pathbytes);
|
||||||
|
#endif
|
||||||
p = (PyObject*(*)(void))p0;
|
p = (PyObject*(*)(void))p0;
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue