Use QString for SubPluginFeatures' virtuals

The former virtuals returned `const char*`, which lead to invalid reads when
`LadspaSubPluginFeatures` returned pointers to temporary `QByteArray::data`.
This commit is contained in:
Johannes Lorenz
2019-01-18 23:22:52 +01:00
parent f3b23830fb
commit d5dcebed83
5 changed files with 28 additions and 18 deletions

View File

@@ -89,6 +89,14 @@ T use_this_or(T this_param, T or_param)
QString use_this_or(QString this_param, QString or_param)
{
return this_param.isNull() ? or_param : this_param;
}
QString Plugin::displayName() const
{
return Model::displayName().isEmpty() // currently always empty
@@ -113,7 +121,7 @@ const PixmapLoader* Plugin::logo() const
const char *Plugin::Descriptor::SubPluginFeatures::Key::additionalFileExtensions() const
QString Plugin::Descriptor::SubPluginFeatures::Key::additionalFileExtensions() const
{
Q_ASSERT(isValid());
return desc->subPluginFeatures
@@ -126,12 +134,13 @@ const char *Plugin::Descriptor::SubPluginFeatures::Key::additionalFileExtensions
const char* Plugin::Descriptor::SubPluginFeatures::Key::displayName() const
QString Plugin::Descriptor::SubPluginFeatures::Key::displayName() const
{
Q_ASSERT(isValid());
return desc->subPluginFeatures
// get from sub plugin
? use_this_or(desc->subPluginFeatures->displayName(*this), desc->displayName)
? use_this_or(desc->subPluginFeatures->displayName(*this),
QString::fromUtf8(desc->displayName))
// get from plugin
: desc->displayName;
}
@@ -150,11 +159,12 @@ const PixmapLoader* Plugin::Descriptor::SubPluginFeatures::Key::logo() const
const char *Plugin::Descriptor::SubPluginFeatures::Key::description() const
QString Plugin::Descriptor::SubPluginFeatures::Key::description() const
{
Q_ASSERT(isValid());
return desc->subPluginFeatures
? use_this_or(desc->subPluginFeatures->description(*this), desc->description)
? use_this_or(desc->subPluginFeatures->description(*this),
QString::fromUtf8(desc->description))
: desc->description;
}

View File

@@ -194,12 +194,12 @@ void PluginFactory::discoverPlugins()
pluginInfos << info;
auto addSupportedFileTypes =
[this](const char* supportedFileTypes,
[this](QString supportedFileTypes,
const PluginInfo& info,
const Plugin::Descriptor::SubPluginFeatures::Key* key = nullptr)
{
if(supportedFileTypes)
for (const QString& ext : QString(supportedFileTypes).split(','))
if(!supportedFileTypes.isNull())
for (const QString& ext : supportedFileTypes.split(','))
{
//qDebug() << "Plugin " << info.name() << "supports" << ext;
PluginInfoAndKey infoAndKey;
@@ -212,7 +212,7 @@ void PluginFactory::discoverPlugins()
};
if (info.descriptor->supportedFileTypes)
addSupportedFileTypes(info.descriptor->supportedFileTypes, info);
addSupportedFileTypes(QString(info.descriptor->supportedFileTypes), info);
if (info.descriptor->subPluginFeatures)
{