X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/c0a23a5450191c9c67b8ab7ce7b0aea382fa6da6..f1920d78123667716f2321d37ce37628603b2700:/uip/mhfixmsg.c diff --git a/uip/mhfixmsg.c b/uip/mhfixmsg.c index 8a586182..65abd513 100644 --- a/uip/mhfixmsg.c +++ b/uip/mhfixmsg.c @@ -119,6 +119,7 @@ static int strip_crs (CT, int *); static int convert_charsets (CT, char *, int *); static int fix_always (CT, int *); static int write_content (CT, char *, char *, int, int); +static void set_text_ctparams(CT, char *, int); static int remove_file (char *); static void report (char *, char *, char *, char *, ...); static void pipeser (int); @@ -346,15 +347,7 @@ main (int argc, char **argv) { ctp = cts; if ((ct = parse_mime (file))) { - if (ct->c_type == CT_TEXT) { - /* parse_mime() does not set lf_line_endings in struct text, so set it here. */ - if (ct->c_ctparams == NULL) { - if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == NULL) { - adios (NULL, "out of memory"); - } - } - ((struct text *) ct->c_ctparams)->lf_line_endings = fx.lf_line_endings; - } + set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings); *ctp++ = ct; } } else { @@ -398,16 +391,7 @@ main (int argc, char **argv) { msgnam = m_name (msgnum); if ((ct = parse_mime (msgnam))) { - if (ct->c_type == CT_TEXT) { - /* parse_mime() does not set lf_line_endings in struct text, so set it here. */ - if (ct->c_ctparams == NULL) { - if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == - NULL) { - adios (NULL, "out of memory"); - } - } - ((struct text *) ct->c_ctparams)->lf_line_endings = fx.lf_line_endings; - } + set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings); *ctp++ = ct; } } @@ -599,7 +583,16 @@ fix_boundary (CT *ct, int *message_mods) { } free (part_boundary); + } else { + /* Couldn't fix the boundary. Report failure so that mhfixmsg + doesn't modify the message. */ + status = NOTOK; } + } else { + /* No multipart struct, even though the content type is + CT_MULTIPART. Report failure so that mhfixmsg doesn't modify + the message. */ + status = NOTOK; } } @@ -1821,8 +1814,7 @@ decode_text_parts (CT ct, int encoding, const char *decodetypes, int *message_mo } lf_line_endings = - ct->c_type == CT_TEXT && ct->c_ctparams && - ((struct text *) ct->c_ctparams)->lf_line_endings; + ct->c_ctparams && ((struct text *) ct->c_ctparams)->lf_line_endings; switch (ct->c_encoding) { case CE_BASE64: @@ -2356,6 +2348,44 @@ write_content (CT ct, char *input_filename, char *outfile, int modify_inplace, } +/* + * parse_mime() does not set lf_line_endings in struct text, so use this function to do it. + * It touches the parts the decodetypes identifies. + */ +static void +set_text_ctparams(CT ct, char *decodetypes, int lf_line_endings) { + switch (ct->c_type) { + case CT_MULTIPART: { + struct multipart *m = (struct multipart *) ct->c_ctparams; + struct part *part; + + for (part = m->mp_parts; part; part = part->mp_next) { + set_text_ctparams(part->mp_part, decodetypes, lf_line_endings); + } + break; + } + + case CT_MESSAGE: + if (ct->c_subtype == MESSAGE_EXTERNAL) { + struct exbody *e = (struct exbody *) ct->c_ctparams; + + set_text_ctparams(e->eb_content, decodetypes, lf_line_endings); + } + break; + + default: + if (should_decode(decodetypes, ct->c_ctinfo.ci_type, ct->c_ctinfo.ci_subtype)) { + if (ct->c_ctparams == NULL) { + if ((ct->c_ctparams = (struct text *) mh_xcalloc (1, sizeof (struct text))) == NULL) { + adios (NULL, "out of memory"); + } + } + ((struct text *) ct->c_ctparams)->lf_line_endings = lf_line_endings; + } + } +} + + /* * If "rmmproc" is defined, call that to remove the file. Otherwise, * use the standard MH backup file.