QLibrary: use QStaticByteArrayMatcher

Because of code-after-return style, I don't actually know what the
code is used for, but since it's compiled, make sure to not leave a
dynamically-initialized static variable lying around, even if control
never reaches it.

Pick-to: 6.3
Change-Id: I6ce30d8c060f96a2d819ed85f79d18a7ef7e9b05
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Marc Mutz 2022-02-02 18:38:21 +01:00
parent 1559cd8ff2
commit d34c3f9e94
1 changed files with 10 additions and 2 deletions

View File

@ -210,8 +210,16 @@ static QLibraryScanResult qt_find_pattern(const char *s, qsizetype s_len, QStrin
#elif defined(Q_OS_WIN)
return QCoffPeParser::parse({s, s_len}, errMsg);
#endif
QByteArrayView pattern = QPluginMetaData::MagicString;
static const QByteArrayMatcher matcher(pattern.toByteArray());
static constexpr auto matcher = [] {
// QPluginMetaData::MagicString is not NUL-terminated, but
// qMakeStaticByteArrayMatcher requires its argument to be, so
// duplicate here, but statically check we didn't mess up:
constexpr auto &pattern = "QTMETADATA !";
constexpr auto magic = std::string_view(QPluginMetaData::MagicString,
sizeof(QPluginMetaData::MagicString));
static_assert(pattern == magic);
return qMakeStaticByteArrayMatcher(pattern);
}();
qsizetype i = matcher.indexIn(s, s_len);
if (i < 0) {
*errMsg = QLibrary::tr("'%1' is not a Qt plugin").arg(*errMsg);