summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-05 14:25:13 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-05 14:25:13 +0200
commit68fa07ac7849934c6245346873147ff9963d22a3 (patch)
tree916514f7a3cb2eb003fa8d426f64bf26bad7a6e6
parent233341f58ce4a362803b5a2df356b34592934cc2 (diff)
downloadkube-68fa07ac7849934c6245346873147ff9963d22a3.tar.gz
kube-68fa07ac7849934c6245346873147ff9963d22a3.zip
Avoid leaking created nodes
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.cpp13
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.h3
-rw-r--r--framework/src/domain/mime/mimetreeparser/utils.cpp4
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
62MessagePart::~MessagePart() 62MessagePart::~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
315void MessagePart::bindLifetime(KMime::Content *node)
316{
317 mNodesToDelete << node;
318}
319
312//-----MessagePartList---------------------- 320//-----MessagePartList----------------------
313MessagePartList::MessagePartList(ObjectTreeParser *otp, KMime::Content *node) 321MessagePartList::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
118protected: 120protected:
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
128private: 131private:
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
38KMime::Content *MimeTreeParser::findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType) 40KMime::Content *MimeTreeParser::findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType)