X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhparse.c;h=a478b4271f98ff3c4a31aa40ba3d9220fc772e18;hp=67d769caf01ea497d3ec1a2056c50b2a7a0c7c20;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=04a3dfc70394a517a79340a7d3ecd9c6a23d0bee diff --git a/uip/mhparse.c b/uip/mhparse.c index 67d769c..a478b42 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -250,7 +250,13 @@ get_content(FILE *in, char *file, int toplevel) */ for (compnum = 1, state = FLD2;;) { switch (state = m_getfld2(state, &f, in)) { + case LENERR2: + state = FLD2; + /* FALL */ case FLD2: + if (compnum == 1) { + ct->crlf = f.value[f.valuelen-2] == '\r'; + } compnum++; /* add the header data to the list */ @@ -267,11 +273,13 @@ get_content(FILE *in, char *file, int toplevel) ct->c_begin = ftell(in); break; - case LENERR2: case FMTERR2: + advise(NULL, "message format error in component #%d", compnum); + state = FLD2; + continue; + case IOERR2: - adios(EX_DATAERR, NULL, "message format error in component #%d", - compnum); + adios(EX_IOERR, "m_getfld2", "io error"); default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); @@ -545,13 +553,19 @@ incl_name_value(unsigned char *buf, char *name, char *value) { ** one, return the entire value. Note that, for example, a name_suffix ** of name will match filename="foo", and return foo. */ -static char * +char * extract_name_value(char *name_suffix, char *value) { - char *extracted_name_value = value; - char *name_suffix_plus_quote = concat(name_suffix, "=\"", NULL); - char *name_suffix_equals = strstr(value, name_suffix_plus_quote); + char *extracted_name_value; + char *name_suffix_plus_quote; + char *name_suffix_equals; char *cp; + if (!value) { + return value; + } + extracted_name_value = value; + name_suffix_plus_quote = concat(name_suffix, "=\"", NULL); + name_suffix_equals = strstr(value, name_suffix_plus_quote); mh_free0(&name_suffix_plus_quote); if (name_suffix_equals) { char *name_suffix_begin; @@ -1014,7 +1028,7 @@ InitMultiPart(CT ct) */ if (ct->c_encoding != CE_7BIT && ct->c_encoding != CE_8BIT && ct->c_encoding != CE_BINARY) { - admonish(NULL, "\"%s/%s\" type in message %s must be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); + admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); ct->c_encoding = CE_7BIT; } @@ -1061,8 +1075,14 @@ InitMultiPart(CT ct) *++dp = '\0'; /* record boundary separators */ - m->mp_start = concat(bp, "\n", NULL); - m->mp_stop = concat(bp, "--\n", NULL); + if (!ct->crlf) { + m->mp_start = concat(bp, "\n", NULL); + m->mp_stop = concat(bp, "--\n", NULL); + } else { + m->mp_start = concat(bp, "\r\n", NULL); + m->mp_stop = concat(bp, "--\r\n", NULL); + } + if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) { advise(ct->c_file, "unable to open for reading"); @@ -1232,9 +1252,9 @@ InitMessage(CT ct) struct k2v *kv; CI ci = &ct->c_ctinfo; - if ((ct->c_encoding != CE_7BIT) && (ct->c_encoding != CE_8BIT)) { - admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit or 8bit", ci->ci_type, ci->ci_subtype, ct->c_file); - return NOTOK; + if ((ct->c_encoding != CE_7BIT) && (ct->c_encoding != CE_8BIT) && (ct->c_encoding != CE_BINARY)) { + admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); + ct->c_encoding = CE_7BIT; } /* check for missing subtype */