From 0e4edc8b16f734ae843ca518f0316705adf78f8f Mon Sep 17 00:00:00 2001 From: Richard Langlois Date: Thu, 22 Sep 2022 20:52:37 -0400 Subject: [PATCH] Windows: use QSystemLibrary instead of LoadLibrary directly (#77) * Windows: use QSystemLibrary instead of LoadLibrary directly Using QSystemLibrary ensures that it will only use the expected copy of the system library and not one that has been placed in the application's working directory or elsewhere in the PATH environment variable. Pick-to: 5.15 6.2 6.3 Change-Id: Ic4234334f73482b38ee5f06345bf11f8c029edc5 Reviewed-by: Laszlo Agocs Reviewed-by: Thiago Macieira Reviewed-by: Qt CI Bot * Windows: use QSystemLibrary instead of LoadLibrary directly (5.15) This is the rest of the patch that is specific to Qt 5.15. Using QSystemLibrary ensures that it will only use the expected copy of the system library and not one that has been placed in the application's working directory or elsewhere in the PATH environment variable. Change-Id: Ic559957f5ca2e53193a1c230577f877b09e90859 Co-authored-by: Andy Shaw Co-authored-by: Keith Kyzivat --- src/corelib/io/qlockfile_win.cpp | 4 +++- src/network/kernel/qauthenticator.cpp | 3 ++- .../platforms/windows/qwindowsglcontext.cpp | 17 ++++++++++++----- .../platforms/windows/qwindowsopengltester.cpp | 3 ++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/corelib/io/qlockfile_win.cpp b/src/corelib/io/qlockfile_win.cpp index 277f8d42309..38ecef55501 100644 --- a/src/corelib/io/qlockfile_win.cpp +++ b/src/corelib/io/qlockfile_win.cpp @@ -48,6 +48,8 @@ #include "QtCore/qdebug.h" #include "QtCore/qthread.h" +#include "private/qsystemlibrary_p.h" + QT_BEGIN_NAMESPACE static inline bool fileExists(const wchar_t *fileName) @@ -150,7 +152,7 @@ QString QLockFilePrivate::processNameByPid(qint64 pid) #if !defined(Q_OS_WINRT) typedef DWORD (WINAPI *GetModuleFileNameExFunc)(HANDLE, HMODULE, LPTSTR, DWORD); - HMODULE hPsapi = LoadLibraryA("psapi"); + HMODULE hPsapi = QSystemLibrary::load(L"psapi"); if (!hPsapi) return QString(); GetModuleFileNameExFunc qGetModuleFileNameEx = reinterpret_cast( diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index 86242b011fe..c317d1fe393 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -50,6 +50,7 @@ #include #include #include +#include "private/qsystemlibrary_p.h" #ifdef Q_OS_WIN #include @@ -1542,7 +1543,7 @@ static bool q_SSPI_library_load() // Initialize security interface if (pSecurityFunctionTable == nullptr) { - securityDLLHandle = LoadLibrary(L"secur32.dll"); + securityDLLHandle = QSystemLibrary::load(L"secur32"); if (securityDLLHandle != nullptr) { INIT_SECURITY_INTERFACE pInitSecurityInterface = reinterpret_cast( diff --git a/src/plugins/platforms/windows/qwindowsglcontext.cpp b/src/plugins/platforms/windows/qwindowsglcontext.cpp index d4ad2b3e770..b6a85f990c0 100644 --- a/src/plugins/platforms/windows/qwindowsglcontext.cpp +++ b/src/plugins/platforms/windows/qwindowsglcontext.cpp @@ -48,6 +48,7 @@ #include #include +#include #include #include @@ -162,19 +163,25 @@ QFunctionPointer QWindowsOpengl32DLL::resolve(const char *name) bool QWindowsOpengl32DLL::init(bool softwareRendering) { - const QByteArray opengl32 = QByteArrayLiteral("opengl32.dll"); - const QByteArray swopengl = QByteArrayLiteral("opengl32sw.dll"); + const QByteArray opengl32 = QByteArrayLiteral("opengl32"); + const QByteArray swopengl = QByteArrayLiteral("opengl32sw"); + bool useSystemLib = false; QByteArray openglDll = qgetenv("QT_OPENGL_DLL"); - if (openglDll.isEmpty()) + if (openglDll.isEmpty()) { openglDll = softwareRendering ? swopengl : opengl32; + useSystemLib = !softwareRendering; + } openglDll = openglDll.toLower(); m_nonOpengl32 = openglDll != opengl32; qCDebug(lcQpaGl) << "Qt: Using WGL and OpenGL from" << openglDll; - m_lib = ::LoadLibraryA(openglDll.constData()); + if (useSystemLib) + m_lib = QSystemLibrary::load((wchar_t*)(QString::fromLatin1(openglDll).utf16())); + else + m_lib = LoadLibraryA(openglDll.constData()); if (!m_lib) { qErrnoWarning(::GetLastError(), "Failed to load %s", openglDll.constData()); return false; @@ -184,7 +191,7 @@ bool QWindowsOpengl32DLL::init(bool softwareRendering) // Load opengl32.dll always. GDI functions like ChoosePixelFormat do // GetModuleHandle for opengl32.dll and behave differently (and call back into // opengl32) when the module is present. This is fine for dummy contexts and windows. - ::LoadLibraryA("opengl32.dll"); + QSystemLibrary::load(L"opengl32"); } wglCreateContext = reinterpret_cast(resolve("wglCreateContext")); diff --git a/src/plugins/platforms/windows/qwindowsopengltester.cpp b/src/plugins/platforms/windows/qwindowsopengltester.cpp index d7d186e8044..9eb4011bf28 100644 --- a/src/plugins/platforms/windows/qwindowsopengltester.cpp +++ b/src/plugins/platforms/windows/qwindowsopengltester.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #ifndef QT_NO_OPENGL #include @@ -396,7 +397,7 @@ bool QWindowsOpenGLTester::testDesktopGL() // Test #1: Load opengl32.dll and try to resolve an OpenGL 2 function. // This will typically fail on systems that do not have a real OpenGL driver. - lib = LoadLibraryA("opengl32.dll"); + lib = QSystemLibrary::load(L"opengl32"); if (lib) { CreateContext = reinterpret_cast( reinterpret_cast(::GetProcAddress(lib, "wglCreateContext")));