From: Jonathan Tan Date: Fri, 16 Sep 2016 20:49:18 GMT Subject: Re: [RFC/PATCH 3/3] mailinfo: handle in-body header continuations Message-ID: <1b392241-461e-3b87-400d-70d66903e3d7@google.com> In-Reply-To: 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? > > handle_commit_msg(...) > { > 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 -- 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, ...); > strbuf_reset(&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]) > strbuf_release(mi->s_hdr_data[i]); > mi->s_hdr_data[i] = NULL; > } > return 0; > } > > if (patchbreak(line)) { > if (mi->message_id) > strbuf_addf(&mi->log_message, > "Message-Id: %s\n", mi->message_id); > return 1; > } > > strbuf_addbuf(&mi->log_message, line); > return 0; > } > >