mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Issue #11619: _PyImport_LoadDynamicModule() doesn't encode the path to bytes
on Windows.
This commit is contained in:
		
							parent
							
								
									54e7135fe8
								
							
						
					
					
						commit
						2d3222740b
					
				
					 3 changed files with 30 additions and 17 deletions
				
			
		| 
						 | 
					@ -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,13 +197,13 @@ 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue