diff options
author | Robin Burchell <robin.burchell@viroteck.net> | 2016-01-03 04:51:34 +0100 |
---|---|---|
committer | Pekka Vuorela <pvuorela@iki.fi> | 2018-09-08 12:22:07 +0000 |
commit | d676bc1e0e90d69d4c843460be5ad352e60d8a28 (patch) | |
tree | f0bd96f31327deb5e5d253da203fcd80587909f3 | |
parent | 96d1f618c8a5a87a441306191d19e66144db32b0 (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.cpp | 18 | ||||
-rw-r--r-- | src/plugins/messageservices/imap/imapstructure.cpp | 7 |
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()); + } } } } |