To make sure that a pretty_ctx->format substitution doesn't result in an infinite recursion, change the prototype of format_commit_one() to accept one last argument: no_recurse. So, a single substitution by format() must yield a result that can be parsed by format_commit_one() without the help of format(). Signed-off-by: Ramkumar Ramachandra <artagnon@xxxxxxxxx> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- pretty.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pretty.c b/pretty.c index 095e5ba..0063f2d 100644 --- a/pretty.c +++ b/pretty.c @@ -1061,7 +1061,8 @@ static size_t parse_padding_placeholder(struct strbuf *sb, static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ const char *placeholder, - void *context) + void *context, + int no_recurse) { struct format_commit_context *c = context; const struct commit *commit = c->commit; @@ -1069,7 +1070,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ struct commit_list *p; int h1, h2; - if (c->pretty_ctx->format) { + if (!no_recurse && c->pretty_ctx->format) { struct strbuf subst = STRBUF_INIT; int ret = c->pretty_ctx->format(sb, placeholder, context, c->pretty_ctx->user_data, @@ -1083,7 +1084,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ * ret: the length of the original string * before substitution. */ - ret = format_commit_one(sb, subst.buf, context) ? ret : 0; + ret = format_commit_one(sb, subst.buf, context, 1) ? ret : 0; strbuf_release(&subst); return ret; } else if (ret) @@ -1332,7 +1333,7 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */ } while (1) { int modifier = *placeholder == 'C'; - int consumed = format_commit_one(&local_sb, placeholder, c); + int consumed = format_commit_one(&local_sb, placeholder, c, 0); total_consumed += consumed; if (!modifier) @@ -1452,7 +1453,7 @@ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */ if (((struct format_commit_context *)context)->flush_type != no_flush) consumed = format_and_pad_commit(sb, placeholder, context); else - consumed = format_commit_one(sb, placeholder, context); + consumed = format_commit_one(sb, placeholder, context, 0); if (magic == NO_MAGIC) return consumed; -- 1.8.3.2.736.g869de25 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html