On 09/16/2016 01:17 PM, Junio C Hamano wrote:
In other words, wouldn't something like the illustration at the end
of this message sufficient?  If the body consists solely of in-body
header without any patch or patchbreak, we may reach EOF with
something in mi->in_line_header buffer and nothing in
mi->log_message and without this function getting any chance to
return 1, so a careful caller may want to flush in_line_header, but
the overall result of the mailinfo subsystem in such a case would be
an error ("you didn't have any patch or a message?"), so it may not
matter too much.

Noted. (This was one of my concerns - that the caller should, but did not, flush.)

What am I missing?

        if (mi->in_line_header->len) {
                /* we have read the beginning of one in-line header */
                if (line->len && isspace(*line->buf))

This would mean that a message like the following:

  From: Me <m...@example.com>
    -- 8< -- this scissors line will be treated as part of "From"

would have its scissors line treated as a header.

The main reason why I reordered the checks (in RFC/PATCH 1/3) is to avoid this (treating a scissors line with an initial space immediately following an in-body header as part of a header).

(If this is not a concern then yes, I agree that the way you described is simpler and better.)

                        append to mi->in_line_header strbuf;
                        return 0;
                /* otherwise we know mi->in_line_header is now complete */
                check_header(mi, mi->in_line_header, ...);

        if (mi->header_stage && (it is a blank line))
                return 0;

        if (mi->use_inbody_headers && mi->header_stage &&
            (the line looks like beginning of 2822 header)) {
                strbuf_addbuf(&mi->in_line_header, line);
                return 0;
        /* otherwise we are no longer looking at headers */
        mi->header_stage = 0;

        /* normalize the log message to UTF-8. */
        if (convert_to_utf8(mi, line, mi->charset.buf))
                return 0; /* mi->input_error already set */

        if (mi->use_scissors && is_scissors_line(line)) {
                int i;

                strbuf_setlen(&mi->log_message, 0);
                mi->header_stage = 1;

                 * We may have already read "secondary headers"; purge
                 * them to give ourselves a clean restart.
                for (i = 0; header[i]; i++) {
                        if (mi->s_hdr_data[i])
                        mi->s_hdr_data[i] = NULL;
                return 0;

        if (patchbreak(line)) {
                if (mi->message_id)
                                    "Message-Id: %s\n", mi->message_id);
                return 1;

        strbuf_addbuf(&mi->log_message, line);
        return 0;

Reply via email to