diff options
author | Robert Griebl <robert.griebl@qt.io> | 2020-08-05 18:17:17 +0200 |
---|---|---|
committer | Robert Griebl <robert.griebl@qt.io> | 2020-08-10 17:35:27 +0200 |
commit | d0fcd73f447a18581433a2f8ef9332a607c1f239 (patch) | |
tree | 5cbd7c9de9f84df0743cde53ef92cd83f1db89c3 | |
parent | 8f2e64a6c07ac2d078605349787e72067af2b22b (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.prf | 2 | ||||
-rw-r--r-- | src/intent-server-lib/intentserver.cpp | 1 | ||||
-rw-r--r-- | src/main-lib/configuration.cpp | 10 | ||||
-rw-r--r-- | src/main-lib/configuration.h | 2 | ||||
-rw-r--r-- | src/tools/packager/packager.cpp | 44 | ||||
-rw-r--r-- | tests/application/tst_application.cpp | 3 | ||||
-rw-r--r-- | tests/main/tst_main.cpp | 4 |
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() |