diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-06-05 14:25:13 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-06-05 14:25:13 +0200 |
commit | 68fa07ac7849934c6245346873147ff9963d22a3 (patch) | |
tree | 916514f7a3cb2eb003fa8d426f64bf26bad7a6e6 | |
parent | 233341f58ce4a362803b5a2df356b34592934cc2 (diff) | |
download | kube-68fa07ac7849934c6245346873147ff9963d22a3.tar.gz kube-68fa07ac7849934c6245346873147ff9963d22a3.zip |
Avoid leaking created nodes
-rw-r--r-- | framework/src/domain/mime/mimetreeparser/messagepart.cpp | 13 | ||||
-rw-r--r-- | framework/src/domain/mime/mimetreeparser/messagepart.h | 3 | ||||
-rw-r--r-- | framework/src/domain/mime/mimetreeparser/utils.cpp | 4 |
3 files changed, 19 insertions, 1 deletions
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 | |||
61 | 61 | ||
62 | MessagePart::~MessagePart() | 62 | MessagePart::~MessagePart() |
63 | { | 63 | { |
64 | for (auto n : mNodesToDelete) { | ||
65 | delete n; | ||
66 | } | ||
64 | } | 67 | } |
65 | 68 | ||
66 | /* | 69 | /* |
@@ -309,6 +312,11 @@ QVector<EncryptedMessagePart*> MessagePart::encryptions() const | |||
309 | return list; | 312 | return list; |
310 | } | 313 | } |
311 | 314 | ||
315 | void MessagePart::bindLifetime(KMime::Content *node) | ||
316 | { | ||
317 | mNodesToDelete << node; | ||
318 | } | ||
319 | |||
312 | //-----MessagePartList---------------------- | 320 | //-----MessagePartList---------------------- |
313 | MessagePartList::MessagePartList(ObjectTreeParser *otp, KMime::Content *node) | 321 | MessagePartList::MessagePartList(ObjectTreeParser *otp, KMime::Content *node) |
314 | : MessagePart(otp, QString(), node) | 322 | : MessagePart(otp, QString(), node) |
@@ -390,6 +398,7 @@ void TextMessagePart::parseContent() | |||
390 | content->setBody(block.text()); | 398 | content->setBody(block.text()); |
391 | content->parse(); | 399 | content->parse(); |
392 | EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(mOtp, QString(), cryptProto, fromAddress, nullptr, content)); | 400 | EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(mOtp, QString(), cryptProto, fromAddress, nullptr, content)); |
401 | mp->bindLifetime(content); | ||
393 | mp->setIsEncrypted(true); | 402 | mp->setIsEncrypted(true); |
394 | appendSubPart(mp); | 403 | appendSubPart(mp); |
395 | continue; | 404 | continue; |
@@ -398,6 +407,7 @@ void TextMessagePart::parseContent() | |||
398 | content->setBody(block.text()); | 407 | content->setBody(block.text()); |
399 | content->parse(); | 408 | content->parse(); |
400 | SignedMessagePart::Ptr mp(new SignedMessagePart(mOtp, QString(), cryptProto, fromAddress, nullptr, content)); | 409 | SignedMessagePart::Ptr mp(new SignedMessagePart(mOtp, QString(), cryptProto, fromAddress, nullptr, content)); |
410 | mp->bindLifetime(content); | ||
401 | mp->setIsSigned(true); | 411 | mp->setIsSigned(true); |
402 | appendSubPart(mp); | 412 | appendSubPart(mp); |
403 | continue; | 413 | continue; |
@@ -945,6 +955,7 @@ void SignedMessagePart::setVerificationResult(const CryptoBodyPartMemento *m, KM | |||
945 | auto tempNode = new KMime::Content(); | 955 | auto tempNode = new KMime::Content(); |
946 | tempNode->setContent(KMime::CRLFtoLF(mVerifiedText.constData())); | 956 | tempNode->setContent(KMime::CRLFtoLF(mVerifiedText.constData())); |
947 | tempNode->parse(); | 957 | tempNode->parse(); |
958 | bindLifetime(tempNode); | ||
948 | 959 | ||
949 | if (!tempNode->head().isEmpty()) { | 960 | if (!tempNode->head().isEmpty()) { |
950 | tempNode->contentDescription()->from7BitString("signed data"); | 961 | tempNode->contentDescription()->from7BitString("signed data"); |
@@ -1028,6 +1039,7 @@ void EncryptedMessagePart::startDecryption(const QByteArray &text, const QTextCo | |||
1028 | KMime::Content *content = new KMime::Content; | 1039 | KMime::Content *content = new KMime::Content; |
1029 | content->setBody(text); | 1040 | content->setBody(text); |
1030 | content->parse(); | 1041 | content->parse(); |
1042 | bindLifetime(content); | ||
1031 | 1043 | ||
1032 | startDecryption(content); | 1044 | startDecryption(content); |
1033 | 1045 | ||
@@ -1188,6 +1200,7 @@ void EncryptedMessagePart::startDecryption(KMime::Content *data) | |||
1188 | auto tempNode = new KMime::Content(); | 1200 | auto tempNode = new KMime::Content(); |
1189 | tempNode->setContent(KMime::CRLFtoLF(mDecryptedData.constData())); | 1201 | tempNode->setContent(KMime::CRLFtoLF(mDecryptedData.constData())); |
1190 | tempNode->parse(); | 1202 | tempNode->parse(); |
1203 | bindLifetime(tempNode); | ||
1191 | 1204 | ||
1192 | if (!tempNode->head().isEmpty()) { | 1205 | if (!tempNode->head().isEmpty()) { |
1193 | tempNode->contentDescription()->from7BitString("encrypted data"); | 1206 | 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: | |||
115 | QVector<SignedMessagePart*> signatures() const; | 115 | QVector<SignedMessagePart*> signatures() const; |
116 | QVector<EncryptedMessagePart*> encryptions() const; | 116 | QVector<EncryptedMessagePart*> encryptions() const; |
117 | 117 | ||
118 | void bindLifetime(KMime::Content *); | ||
119 | |||
118 | protected: | 120 | protected: |
119 | void parseInternal(KMime::Content *node, bool onlyOneMimePart); | 121 | void parseInternal(KMime::Content *node, bool onlyOneMimePart); |
120 | QString renderInternalText() const; | 122 | QString renderInternalText() const; |
@@ -124,6 +126,7 @@ protected: | |||
124 | PartMetaData mMetaData; | 126 | PartMetaData mMetaData; |
125 | MessagePart *mParentPart; | 127 | MessagePart *mParentPart; |
126 | KMime::Content *mNode; | 128 | KMime::Content *mNode; |
129 | QVector<KMime::Content*> mNodesToDelete; | ||
127 | 130 | ||
128 | private: | 131 | private: |
129 | QVector<MessagePart::Ptr> mBlocks; | 132 | QVector<MessagePart::Ptr> 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 | |||
32 | newNode->contentDescription()->from7BitString(cntDesc); | 32 | newNode->contentDescription()->from7BitString(cntDesc); |
33 | } | 33 | } |
34 | 34 | ||
35 | return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false)); | 35 | auto mp = MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false)); |
36 | mp->bindLifetime(newNode); | ||
37 | return mp; | ||
36 | } | 38 | } |
37 | 39 | ||
38 | KMime::Content *MimeTreeParser::findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType) | 40 | KMime::Content *MimeTreeParser::findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType) |