From 68fa07ac7849934c6245346873147ff9963d22a3 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 5 Jun 2017 14:25:13 +0200 Subject: Avoid leaking created nodes --- framework/src/domain/mime/mimetreeparser/messagepart.cpp | 13 +++++++++++++ framework/src/domain/mime/mimetreeparser/messagepart.h | 3 +++ framework/src/domain/mime/mimetreeparser/utils.cpp | 4 +++- 3 files changed, 19 insertions(+), 1 deletion(-) (limited to 'framework/src/domain/mime/mimetreeparser') diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index d955e663..b4db4016 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp @@ -61,6 +61,9 @@ MessagePart::MessagePart(ObjectTreeParser *otp, const QString &text, KMime::Cont MessagePart::~MessagePart() { + for (auto n : mNodesToDelete) { + delete n; + } } /* @@ -309,6 +312,11 @@ QVector MessagePart::encryptions() const return list; } +void MessagePart::bindLifetime(KMime::Content *node) +{ + mNodesToDelete << node; +} + //-----MessagePartList---------------------- MessagePartList::MessagePartList(ObjectTreeParser *otp, KMime::Content *node) : MessagePart(otp, QString(), node) @@ -390,6 +398,7 @@ void TextMessagePart::parseContent() content->setBody(block.text()); content->parse(); EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(mOtp, QString(), cryptProto, fromAddress, nullptr, content)); + mp->bindLifetime(content); mp->setIsEncrypted(true); appendSubPart(mp); continue; @@ -398,6 +407,7 @@ void TextMessagePart::parseContent() content->setBody(block.text()); content->parse(); SignedMessagePart::Ptr mp(new SignedMessagePart(mOtp, QString(), cryptProto, fromAddress, nullptr, content)); + mp->bindLifetime(content); mp->setIsSigned(true); appendSubPart(mp); continue; @@ -945,6 +955,7 @@ void SignedMessagePart::setVerificationResult(const CryptoBodyPartMemento *m, KM auto tempNode = new KMime::Content(); tempNode->setContent(KMime::CRLFtoLF(mVerifiedText.constData())); tempNode->parse(); + bindLifetime(tempNode); if (!tempNode->head().isEmpty()) { tempNode->contentDescription()->from7BitString("signed data"); @@ -1028,6 +1039,7 @@ void EncryptedMessagePart::startDecryption(const QByteArray &text, const QTextCo KMime::Content *content = new KMime::Content; content->setBody(text); content->parse(); + bindLifetime(content); startDecryption(content); @@ -1188,6 +1200,7 @@ void EncryptedMessagePart::startDecryption(KMime::Content *data) auto tempNode = new KMime::Content(); tempNode->setContent(KMime::CRLFtoLF(mDecryptedData.constData())); tempNode->parse(); + bindLifetime(tempNode); if (!tempNode->head().isEmpty()) { tempNode->contentDescription()->from7BitString("encrypted data"); diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h index 0c206210..9fe34c3b 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.h +++ b/framework/src/domain/mime/mimetreeparser/messagepart.h @@ -115,6 +115,8 @@ public: QVector signatures() const; QVector encryptions() const; + void bindLifetime(KMime::Content *); + protected: void parseInternal(KMime::Content *node, bool onlyOneMimePart); QString renderInternalText() const; @@ -124,6 +126,7 @@ protected: PartMetaData mMetaData; MessagePart *mParentPart; KMime::Content *mNode; + QVector mNodesToDelete; private: QVector mBlocks; diff --git a/framework/src/domain/mime/mimetreeparser/utils.cpp b/framework/src/domain/mime/mimetreeparser/utils.cpp index 6fae9022..be3e43dc 100644 --- a/framework/src/domain/mime/mimetreeparser/utils.cpp +++ b/framework/src/domain/mime/mimetreeparser/utils.cpp @@ -32,7 +32,9 @@ MimeMessagePart::Ptr MimeTreeParser::createAndParseTempNode(Interface::BodyPart newNode->contentDescription()->from7BitString(cntDesc); } - return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false)); + auto mp = MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false)); + mp->bindLifetime(newNode); + return mp; } KMime::Content *MimeTreeParser::findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType) -- cgit v1.2.3