X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fm_getfld.c;h=bbf11fed6dc877abc72650d5f1bebfd49cac8c2f;hp=c542d52fb09427a322005a6b3ee726f100790ad3;hb=8b4410a1f3cb75e3d92b61176397655d509f81ee;hpb=a139e1ddbbe5e7fe89d7eb4a5dc16d4b9698960a diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index c542d52..bbf11fe 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -314,10 +314,35 @@ m_getfld (int state, unsigned char *name, unsigned char *buf, * . hit the end of the buffer. (loop) */ if (c == '\n') { - *cp = *buf = 0; - advise (NULL, "eol encountered in field \"%s\"", name); - state = FMTERR; - goto finish; + /* We hit the end of the line without seeing ':' to + * terminate the field name. This is usually (always?) + * spam. But, blowing up is lame, especially when + * scan(1)ing a folder with such messages. Pretend such + * lines are the first of the body (at least mutt also + * handles it this way). */ + + /* See if buf can hold this line, since we were assuming + * we had a buffer of NAMESZ, not bufsz. */ + /* + 1 for the newline */ + if (bufsz < j + 1) { + /* No, it can't. Oh well, guess we'll blow up. */ + *cp = *buf = 0; + advise (NULL, "eol encountered in field \"%s\"", name); + state = FMTERR; + goto finish; + } + memcpy (buf, name, j - 1); + buf[j - 1] = '\n'; + buf[j] = '\0'; + /* mhparse.c:get_content wants to find the position of the + * body start, but it thinks there's a blank line between + * the header and the body (naturally!), so seek back so + * that things line up even though we don't have that + * blank line in this case. Simpler parsers (e.g. mhl) + * get extra newlines, but that should be harmless enough, + * right? This is a corrupt message anyway. */ + fseek (iob, ftell (iob) - 2, SEEK_SET); + return BODY; } if ((i -= j) <= 0) { *cp = *buf = 0;