diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-07-23 17:07:11 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-07-23 17:07:11 +0300 |
commit | 9b62d1ff01f949aeff165753eea17e108bcccd9b (patch) | |
tree | 4205ec5cf72ff5387513706ec7e3904cf9b278a3 | |
parent | ff9c0a396c14c219532dd667d49ebc7a3f376f9b (diff) | |
download | mailutils-9b62d1ff01f949aeff165753eea17e108bcccd9b.tar.gz mailutils-9b62d1ff01f949aeff165753eea17e108bcccd9b.tar.bz2 |
decodemail: better error tolerance
* decodemail/decodemail.c (message_decode): Don't bail out
if unable to get the Content-Type header or copy the message
envelope.
-rw-r--r-- | decodemail/decodemail.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/decodemail/decodemail.c b/decodemail/decodemail.c index 745c54e5f..4fa445b2e 100644 --- a/decodemail/decodemail.c +++ b/decodemail/decodemail.c @@ -215,6 +215,7 @@ main (int argc, char **argv) err = 1; continue; } + newmsg = message_decode (msg, MSG_TOP); message_store (newmsg, ombox); mu_message_unref (newmsg); @@ -453,7 +454,8 @@ message_decode (mu_message_t msg, int what) { mu_diag_funcall (MU_DIAG_ERROR, "mu_header_aget_value_unfold", MU_HEADER_CONTENT_TYPE, rc); - exit (EX_SOFTWARE); + mu_message_ref (msg); + return msg; } rc = mu_content_type_parse (s, NULL, &ct); if (rc) @@ -520,21 +522,37 @@ message_decode (mu_message_t msg, int what) rc = mu_message_get_envelope (msg, &env); if (rc == 0) { - rc = mu_envelope_create (&newenv, newmsg); - if (rc == 0) + char *sender = NULL, *date = NULL; + if ((rc = mu_envelope_aget_sender (env, &sender)) != 0) { - if ((rc = mu_envelope_aget_sender (env, &newenv->sender)) || - (rc = mu_envelope_aget_date (env, &newenv->date))) + mu_diag_funcall (MU_DIAG_ERROR, "mu_envelope_aget_sender", + NULL, rc); + } + else if ((rc = mu_envelope_aget_date (env, &date)) != 0) + { + free (sender); + sender = NULL; + mu_diag_funcall (MU_DIAG_ERROR, "mu_envelope_aget_date", + NULL, rc); + } + + if (sender) + { + if ((rc = mu_envelope_create (&newenv, newmsg)) == 0) + { + newenv->sender = sender; + newenv->date = date; + mu_message_set_envelope (newmsg, newenv, + mu_message_get_owner (newmsg)); + } + else { - mu_error ("%s", _("can't copy envelope")); - exit (EX_UNAVAILABLE); + free (sender); + free (date); + mu_diag_funcall (MU_DIAG_ERROR, "mu_envelope_create", + NULL, rc); } - mu_message_set_envelope (newmsg, newenv, - mu_message_get_owner (newmsg)); } - else - mu_diag_funcall (MU_DIAG_ERROR, "mu_envelope_create", - NULL, rc); } else mu_diag_funcall (MU_DIAG_ERROR, "mu_message_get_envelope", |