diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2021-09-25 11:01:57 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2021-10-11 18:59:52 -0700 |
commit | 8e5fcf02bdf3395071b3174777d059faf76a03c6 (patch) | |
tree | 09e468d006a4bbb0fbd89e5485043145b42cc0c8 /src/corelib/plugin/qlibrary.cpp | |
parent | c89286b26abd7bad5918359e2f6fe7c5785dc94d (diff) |
QPlugin: add qt_plugin_query_metadata_v2() to dynamic plugins
They return a pointer to the actual header, skipping the magic string.
This is done in preparation for the header located in an ELF note, which
won't have the magic.
Change-Id: I3eb1bd30e0124f89a052fffd16a8229bec2ad588
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/plugin/qlibrary.cpp')
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index a8c6644bfd..e18a5080f5 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -682,18 +682,31 @@ static bool qt_get_metadata(QLibraryPrivate *priv, QString *errMsg) return false; }; - QFunctionPointer pfn = priv->resolve("qt_plugin_query_metadata"); - if (!pfn) - return error(QLibrary::tr("entrypoint 'qt_plugin_query_metadata' not found")); + QPluginMetaData metaData; + QFunctionPointer pfn = priv->resolve("qt_plugin_query_metadata_v2"); + if (pfn) { + metaData = reinterpret_cast<QPluginMetaData (*)()>(pfn)(); +#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) + } else if ((pfn = priv->resolve("qt_plugin_query_metadata"))) { + metaData = reinterpret_cast<QPluginMetaData (*)()>(pfn)(); + if (metaData.size < sizeof(QPluginMetaData::MagicHeader)) + return error(QLibrary::tr("metadata too small")); + + // adjust the meta data to point to the header + auto data = reinterpret_cast<const char *>(metaData.data); + data += sizeof(QPluginMetaData::MagicString); + metaData.data = data; + metaData.size -= sizeof(QPluginMetaData::MagicString); +#endif + } else { + return error(QLibrary::tr("entrypoint to query the plugin meta data not found")); + } - auto metaData = reinterpret_cast<QPluginMetaData (*)()>(pfn)(); - auto data = reinterpret_cast<const char *>(metaData.data); - if (metaData.size < sizeof(QPluginMetaData::MagicHeader)) + if (metaData.size < sizeof(QPluginMetaData::Header)) return error(QLibrary::tr("metadata too small")); - data += sizeof(QPluginMetaData::MagicString); - metaData.size -= sizeof(QPluginMetaData::MagicString); - QJsonDocument doc = qJsonFromRawLibraryMetaData(data, metaData.size, errMsg); + QJsonDocument doc = qJsonFromRawLibraryMetaData(reinterpret_cast<const char *>(metaData.data), + metaData.size, errMsg); if (doc.isNull()) return false; // error message already set |