summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-07-23 17:07:11 +0300
committerSergey Poznyakoff <gray@gnu.org>2020-07-23 17:07:11 +0300
commit9b62d1ff01f949aeff165753eea17e108bcccd9b (patch)
tree4205ec5cf72ff5387513706ec7e3904cf9b278a3
parentff9c0a396c14c219532dd667d49ebc7a3f376f9b (diff)
downloadmailutils-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.c42
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",

Return to:

Send suggestions and report system problems to the System administrator.