summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Burchell <robin.burchell@viroteck.net>2016-01-03 04:51:34 +0100
committerPekka Vuorela <pvuorela@iki.fi>2018-09-08 12:22:07 +0000
commitd676bc1e0e90d69d4c843460be5ad352e60d8a28 (patch)
treef0bd96f31327deb5e5d253da203fcd80587909f3
parent96d1f618c8a5a87a441306191d19e66144db32b0 (diff)
Gracefully handle bodystructure where boundaries are reported as NIL.
Some servers (e.g mail.ru) report boundaries as NIL for multipart messages. from my understanding of RFC2046 this is invalid, but we can gracefully handle those by setting them to empty. Avoids crash when requesting a partAt() for a message that does not exist, this happened due to NIL boundaries, but no need to crash in such cases. Change-Id: I676e444184ad1ca39f93bc8d18635f134a315d0a Done-with: Valério Valério <valerio.valerio@jolla.com> Reviewed-by: Valerio Valerio <vdv100@gmail.com>
-rw-r--r--src/libraries/qmfclient/qmailmessage.cpp18
-rw-r--r--src/plugins/messageservices/imap/imapstructure.cpp7
2 files changed, 20 insertions, 5 deletions
diff --git a/src/libraries/qmfclient/qmailmessage.cpp b/src/libraries/qmfclient/qmailmessage.cpp
index c7c075b6..da8b74b7 100644
--- a/src/libraries/qmfclient/qmailmessage.cpp
+++ b/src/libraries/qmfclient/qmailmessage.cpp
@@ -3942,8 +3942,13 @@ const QMailMessagePart& QMailMessagePartContainerPrivate::partAt(const QMailMess
const QList<QMailMessagePart>* partList = &_messageParts;
foreach (uint index, location.d->_indices) {
- part = &(partList->at(index - 1));
- partList = &(part->impl<const QMailMessagePartContainerPrivate>()->_messageParts);
+ if (index >= 0 && index <= partList->size()) {
+ part = &(partList->at(index - 1));
+ partList = &(part->impl<const QMailMessagePartContainerPrivate>()->_messageParts);
+ } else {
+ qMailLog(Messaging) << Q_FUNC_INFO << "Invalid index, container does not have a part at " << index;
+ Q_ASSERT(false);
+ }
}
Q_ASSERT(part);
@@ -3956,8 +3961,13 @@ QMailMessagePart& QMailMessagePartContainerPrivate::partAt(const QMailMessagePar
QList<QMailMessagePart>* partList = &_messageParts;
foreach (uint index, location.d->_indices) {
- part = &((*partList)[index - 1]);
- partList = &(part->impl<QMailMessagePartContainerPrivate>()->_messageParts);
+ if (index >= 0 && index <= partList->size()) {
+ part = &((*partList)[index - 1]);
+ partList = &(part->impl<QMailMessagePartContainerPrivate>()->_messageParts);
+ } else {
+ qMailLog(Messaging) << Q_FUNC_INFO << "Invalid index, container does not have a part at " << index;
+ Q_ASSERT(false);
+ }
}
return *part;
diff --git a/src/plugins/messageservices/imap/imapstructure.cpp b/src/plugins/messageservices/imap/imapstructure.cpp
index a634d9ef..a962d089 100644
--- a/src/plugins/messageservices/imap/imapstructure.cpp
+++ b/src/plugins/messageservices/imap/imapstructure.cpp
@@ -427,7 +427,12 @@ void setMultipartFromDescription(const QStringList &structure, QMailMessagePartC
}
for ( ; (it != end) && ((it + 1) != end); it += 2) {
if ((*it).trimmed().toUpper() == "BOUNDARY") {
- container->setBoundary((*(it + 1)).toLatin1());
+ const QString boundary((*(it + 1)));
+ if (boundary.toUpper() == "NIL") {
+ container->setBoundary(QByteArray());
+ } else {
+ container->setBoundary(boundary.toLatin1());
+ }
}
}
}