diff --git a/lib/message/mu-message-part.cc b/lib/message/mu-message-part.cc index 23758f8f..ec686650 100644 --- a/lib/message/mu-message-part.cc +++ b/lib/message/mu-message-part.cc @@ -67,9 +67,12 @@ MessagePart::cooked_filename() const noexcept // MimeMessagepart. Construct a name based on subject. if (mime_object().is_message_part()) { auto msg{MimeMessagePart{mime_object()}.get_message()}; - return msg.subject() - .map(cleanup) - .value_or("no-subject") + ".eml"; + if (!msg) + return Nothing; + else + return msg->subject() + .map(cleanup) + .value_or("no-subject") + ".eml"; } return Nothing; diff --git a/lib/message/mu-message.cc b/lib/message/mu-message.cc index 1f45d295..9edfe4c5 100644 --- a/lib/message/mu-message.cc +++ b/lib/message/mu-message.cc @@ -417,7 +417,10 @@ process_message_part(const MimeMessagePart& msg_part, Message::Private& info) { auto submsg{msg_part.get_message()}; - submsg.for_each([&](auto&& parent, auto&& child_obj) { + if (!submsg) + return; + + submsg->for_each([&](auto&& parent, auto&& child_obj) { /* XXX: we only handle one level */ diff --git a/lib/message/mu-mime-object.hh b/lib/message/mu-mime-object.hh index e8f3cbd4..2d8f2c26 100644 --- a/lib/message/mu-mime-object.hh +++ b/lib/message/mu-mime-object.hh @@ -1182,11 +1182,14 @@ public: /** * Get the MimeMessage for this MimeMessagePart. * - * @return the MimeMessage + * @return the MimeMessage or Nothing */ - MimeMessage get_message() const { - return MimeMessage( - Object(G_OBJECT(g_mime_message_part_get_message(self())))); + Option get_message() const { + auto msg{g_mime_message_part_get_message(self())}; + if (msg) + return MimeMessage(Object(G_OBJECT(msg))); + else + return Nothing; } private: GMimeMessagePart* self() const { diff --git a/lib/message/test-mu-message.cc b/lib/message/test-mu-message.cc index cfbdc660..474daaa1 100644 --- a/lib/message/test-mu-message.cc +++ b/lib/message/test-mu-message.cc @@ -456,6 +456,22 @@ C0bdoCx44QVU8HaZ2x91h3GoM/0q5bqM/rvCauwbokiJgAUrznecNPY= g_assert_cmpuint(n, ==, 1); } + +static void +test_message_multipart_mixed_rfc822(void) +{ + constexpr const char *msgtext = +R"(Content-Type: multipart/mixed; + boundary="Multipart_Tue_Sep__2_15:42:35_2014-1" + +--Multipart_Tue_Sep__2_15:42:35_2014-1 +Content-Type: message/rfc822 +)"; + auto message{Message::make_from_text(msgtext)}; + g_assert_true(!!message); +} + + int main(int argc, char* argv[]) { @@ -469,6 +485,8 @@ main(int argc, char* argv[]) test_message_signed); g_test_add_func("/message/message/signed-encrypted", test_message_signed_encrypted); + g_test_add_func("/message/message/multipart-mixed-rfc822", + test_message_multipart_mixed_rfc822); return g_test_run(); }