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 <artag...@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 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.247.g485169c

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to