summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Griebl <robert.griebl@qt.io>2020-08-05 18:17:17 +0200
committerRobert Griebl <robert.griebl@qt.io>2020-08-10 17:35:27 +0200
commitd0fcd73f447a18581433a2f8ef9332a607c1f239 (patch)
tree5cbd7c9de9f84df0743cde53ef92cd83f1db89c3
parent8f2e64a6c07ac2d078605349787e72067af2b22b (diff)
Fix memory leaks found with gcc's ASAN
Change-Id: If356a7c5decb8b69db96ba0522211828e6bca4b5 Reviewed-by: Thomas Senyk <thomas.senyk@qt.io>
-rw-r--r--qmake-features/am-config.prf2
-rw-r--r--src/intent-server-lib/intentserver.cpp1
-rw-r--r--src/main-lib/configuration.cpp10
-rw-r--r--src/main-lib/configuration.h2
-rw-r--r--src/tools/packager/packager.cpp44
-rw-r--r--tests/application/tst_application.cpp3
-rw-r--r--tests/main/tst_main.cpp4
7 files changed, 39 insertions, 27 deletions
diff --git a/qmake-features/am-config.prf b/qmake-features/am-config.prf
index 44622f3f..afcaddda 100644
--- a/qmake-features/am-config.prf
+++ b/qmake-features/am-config.prf
@@ -11,6 +11,8 @@ CONFIG += exceptions
DEFINES += QT_MESSAGELOGCONTEXT
+# CONFIG += sanitizer sanitize_address sanitize_undefined
+
win32-msvc*:QMAKE_CXXFLAGS += /FS /wd4290 /DNOMINMAX /D_CRT_SECURE_NO_WARNINGS
disable-installer:DEFINES *= AM_DISABLE_INSTALLER
diff --git a/src/intent-server-lib/intentserver.cpp b/src/intent-server-lib/intentserver.cpp
index 3bf63b5f..5a65ae6b 100644
--- a/src/intent-server-lib/intentserver.cpp
+++ b/src/intent-server-lib/intentserver.cpp
@@ -211,6 +211,7 @@ IntentServer::IntentServer(IntentServerSystemInterface *systemInterface, QObject
IntentServer::~IntentServer()
{
+ qDeleteAll(m_intents);
s_instance = nullptr;
}
diff --git a/src/main-lib/configuration.cpp b/src/main-lib/configuration.cpp
index b85299c4..f7c01015 100644
--- a/src/main-lib/configuration.cpp
+++ b/src/main-lib/configuration.cpp
@@ -327,14 +327,14 @@ void Configuration::parseWithArguments(const QStringList &arguments)
cacheOptions |= AbstractConfigCache::ClearCache;
if (configFilePaths.isEmpty()) {
- m_data = new ConfigurationData();
+ m_data.reset(new ConfigurationData());
} else {
ConfigCache<ConfigurationData> cache(configFilePaths, qSL("config"), "CFGD",
ConfigurationData::DataStreamVersion, cacheOptions);
try {
cache.parse();
- m_data = cache.takeMergedResult();
+ m_data.reset(cache.takeMergedResult());
} catch (const Exception &e) {
showParserMessage(e.errorString() + qL1C('\n'), ErrorMessage);
exit(1);
@@ -349,8 +349,10 @@ void Configuration::parseWithArguments(const QStringList &arguments)
buffer.open(QIODevice::ReadOnly);
try {
ConfigurationData *cd = ConfigCacheAdaptor<ConfigurationData>::loadFromSource(&buffer, qSL("command line"));
- if (cd)
- ConfigCacheAdaptor<ConfigurationData>::merge(m_data, cd);
+ if (cd) {
+ ConfigCacheAdaptor<ConfigurationData>::merge(m_data.data(), cd);
+ delete cd;
+ }
} catch (const Exception &e) {
showParserMessage(QString::fromLatin1("Could not parse --option value: %1.\n")
.arg(e.errorString()),
diff --git a/src/main-lib/configuration.h b/src/main-lib/configuration.h
index 0c46a411..fc96e67e 100644
--- a/src/main-lib/configuration.h
+++ b/src/main-lib/configuration.h
@@ -153,7 +153,7 @@ private:
QStringList m_defaultConfigFilePaths;
QString m_buildConfigFilePath;
QCommandLineParser m_clp;
- ConfigurationData *m_data;
+ QScopedPointer<ConfigurationData> m_data;
QString m_mainQmlFile;
bool m_onlyOnePositionalArgument = false;
bool m_forceVerbose = false;
diff --git a/src/tools/packager/packager.cpp b/src/tools/packager/packager.cpp
index 8d90aec1..db93594d 100644
--- a/src/tools/packager/packager.cpp
+++ b/src/tools/packager/packager.cpp
@@ -136,7 +136,7 @@ int main(int argc, char *argv[])
clp.setOptionsAfterPositionalArgumentsMode(QCommandLineParser::ParseAsOptions);
try {
- PackagingJob *p = nullptr;
+ QScopedPointer<PackagingJob> p;
// REMEMBER to update the completion file util/bash/appman-prompt, if you apply changes below!
switch (command(clp)) {
@@ -204,11 +204,11 @@ int main(int argc, char *argv[])
clp.values(qSL("extra-signed-metadata-file")),
true);
- p = PackagingJob::create(clp.positionalArguments().at(1),
- clp.positionalArguments().at(2),
- extraMetaDataMap,
- extraSignedMetaDataMap,
- clp.isSet(qSL("json")));
+ p.reset(PackagingJob::create(clp.positionalArguments().at(1),
+ clp.positionalArguments().at(2),
+ extraMetaDataMap,
+ extraSignedMetaDataMap,
+ clp.isSet(qSL("json"))));
break;
}
case DevSignPackage:
@@ -223,11 +223,11 @@ int main(int argc, char *argv[])
if (clp.positionalArguments().size() != 5)
clp.showHelp(1);
- p = PackagingJob::developerSign(clp.positionalArguments().at(1),
- clp.positionalArguments().at(2),
- clp.positionalArguments().at(3),
- clp.positionalArguments().at(4),
- clp.isSet(qSL("json")));
+ p.reset(PackagingJob::developerSign(clp.positionalArguments().at(1),
+ clp.positionalArguments().at(2),
+ clp.positionalArguments().at(3),
+ clp.positionalArguments().at(4),
+ clp.isSet(qSL("json"))));
break;
case DevVerifyPackage:
@@ -239,8 +239,8 @@ int main(int argc, char *argv[])
if (clp.positionalArguments().size() < 3)
clp.showHelp(1);
- p = PackagingJob::developerVerify(clp.positionalArguments().at(1),
- clp.positionalArguments().mid(2));
+ p.reset(PackagingJob::developerVerify(clp.positionalArguments().at(1),
+ clp.positionalArguments().mid(2)));
break;
case StoreSignPackage:
@@ -256,12 +256,12 @@ int main(int argc, char *argv[])
if (clp.positionalArguments().size() != 6)
clp.showHelp(1);
- p = PackagingJob::storeSign(clp.positionalArguments().at(1),
- clp.positionalArguments().at(2),
- clp.positionalArguments().at(3),
- clp.positionalArguments().at(4),
- clp.positionalArguments().at(5),
- clp.isSet(qSL("json")));
+ p.reset(PackagingJob::storeSign(clp.positionalArguments().at(1),
+ clp.positionalArguments().at(2),
+ clp.positionalArguments().at(3),
+ clp.positionalArguments().at(4),
+ clp.positionalArguments().at(5),
+ clp.isSet(qSL("json"))));
break;
case StoreVerifyPackage:
@@ -274,9 +274,9 @@ int main(int argc, char *argv[])
if (clp.positionalArguments().size() < 4)
clp.showHelp(1);
- p = PackagingJob::storeVerify(clp.positionalArguments().at(1),
- clp.positionalArguments().mid(2, clp.positionalArguments().size() - 3),
- *--clp.positionalArguments().cend());
+ p.reset(PackagingJob::storeVerify(clp.positionalArguments().at(1),
+ clp.positionalArguments().mid(2, clp.positionalArguments().size() - 3),
+ *--clp.positionalArguments().cend()));
break;
case YamlToJson: {
diff --git a/tests/application/tst_application.cpp b/tests/application/tst_application.cpp
index 20ae20ac..16c5fdb0 100644
--- a/tests/application/tst_application.cpp
+++ b/tests/application/tst_application.cpp
@@ -125,6 +125,9 @@ void tst_Application::runtimeDestroyed()
delete app;
delete runtimeManager;
+ delete ai;
+ delete pkg;
+ delete pi;
}
QTEST_APPLESS_MAIN(tst_Application)
diff --git a/tests/main/tst_main.cpp b/tests/main/tst_main.cpp
index 1ad2a7d5..078da003 100644
--- a/tests/main/tst_main.cpp
+++ b/tests/main/tst_main.cpp
@@ -160,6 +160,10 @@ void tst_Main::destroyMain()
delete main;
main = nullptr;
}
+ if (config) {
+ delete config;
+ config = nullptr;
+ }
}
void tst_Main::cleanup()