QPlugin: don't use QFile::read() if map() fails on Unix

If we can't mmap(), then libdl won't be able to either.

Change-Id: I42eb903a916645db9900fffd16a492a1ac25903f
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit 0be5bf3e64cee329249c1174590d6a0c1a7a543f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Thiago Macieira 2021-09-13 20:29:48 -07:00 committed by Qt Cherry-pick Bot
parent 4d93d2e0f2
commit 9acf8cadc9

View File

@ -252,16 +252,29 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
constexpr qint64 MaxMemoryMapSize =
Q_INT64_C(1) << (sizeof(qsizetype) > 4 ? 40 : 29);
QByteArray data;
qsizetype fdlen = qMin(file.size(), MaxMemoryMapSize);
const char *filedata = reinterpret_cast<char *>(file.map(0, fdlen));
#ifdef Q_OS_UNIX
if (filedata == nullptr) {
// Try reading the data into memory instead (up to 64 MB).
// If we can't mmap(), then the dynamic loader won't be able to either.
// This can't be used as a plugin.
if (qt_debug_component())
qWarning("%s: failed to map to memory: %ls", QFile::encodeName(library).constData(),
qUtf16Printable(file.errorString()));
return false;
}
#else
QByteArray data;
if (filedata == nullptr) {
// It's unknown at this point whether Windows supports LoadLibrary() on
// files that fail to CreateFileMapping / MapViewOfFile, so we err on
// the side of doing a regular read into memory (up to 64 MB).
data = file.read(64 * 1024 * 1024);
filedata = data.constData();
fdlen = data.size();
}
#endif
/*
ELF and Mach-O binaries with GCC have .qplugin sections.