In commit 967dfd4 ("sequencer: use trailer's trailer layout", 2016-11-29), sequencer was taught to use the same mechanism as interpret-trailers to determine the nature of the trailer of a commit message (referred to as the "footer" in sequencer.c). However, the requirement that a footer end in a newline character was inadvertently removed. Restore that requirement. While writing this commit, I noticed that if the "ignore_footer" parameter in "has_conforming_footer" is greater than the distance between the trailer start and sb->len, "has_conforming_footer" will return an unexpected result. This does not occur in practice, because "ignore_footer" is either zero or the return value of an invocation to "ignore_non_trailer", which only skips empty lines and comment lines. This commit contains a comment explaining this in the function's documentation. Reported-by: Brian Norris <computersforpeace@xxxxxxxxx> Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- Thanks for the bug report. Here's a fix - I've verified this with the way to reproduce provided in the original e-mail, and it seems to work now. The commit message of the referenced commit (7b309aef0463340d3ad5449d1f605d14e10a4225) does not end in a newline, which is probably why different behavior was observed with this commit (as compared to others). sequencer.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sequencer.c b/sequencer.c index 77afecaeb..4cbe64b7f 100644 --- a/sequencer.c +++ b/sequencer.c @@ -151,6 +151,12 @@ static const char *get_todo_path(const struct replay_opts *opts) * Returns 1 for conforming footer * Returns 2 when sob exists within conforming footer * Returns 3 when sob exists within conforming footer as last entry + * + * A footer that does not end in a newline is considered non-conforming. + * + * ignore_footer, if not zero, should be the return value of an invocation to + * ignore_non_trailer. See the documentation of that function for more + * information. */ static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob, int ignore_footer) @@ -159,6 +165,11 @@ static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob, int i; int found_sob = 0, found_sob_last = 0; + if (sb->len <= ignore_footer) + return 0; + if (sb->buf[sb->len - ignore_footer - 1] != '\n') + return 0; + trailer_info_get(&info, sb->buf); if (info.trailer_start == info.trailer_end) -- 2.13.0.rc0.306.g87b477812d-goog