git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 06/15] pretty: limit recursion in format_commit_one()

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Jun 9, 2013, 17:54 UTC
Message-ID
<1370800474-8940-7-git-send-email-artagnon@gmail.com>
In-Reply-To
<1370800474-8940-1-git-send-email-artagnon@gmail.com>

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@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@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
Previous: Ramkumar RamachandraNext: Ramkumar Ramachandra
Message 7 of 19 in “Towards a more awesome git branch”
  1. 00/15 Towards a more awesome git branchRamkumar Ramachandra, Jun 9, 2013
  2. 01/15 for-each-ref, quote: convert *_quote_print -> *_quote_bufRamkumar Ramachandra, Jun 9, 2013
  3. 02/15 for-each-ref: don't print out elements directlyRamkumar Ramachandra, Jun 9, 2013
  4. 03/15 tar-tree: remove dependency on sq_quote_print()Ramkumar Ramachandra, Jun 9, 2013
  5. 04/15 quote: remove sq_quote_print()Ramkumar Ramachandra, Jun 9, 2013
  6. 05/15 pretty: extend pretty_print_context with callbackRamkumar Ramachandra, Jun 9, 2013
  7. 06/15 pretty: limit recursion in format_commit_one()Ramkumar Ramachandra, Jun 9, 2013
  8. 07/15 pretty: allow passing NULL commit to format_commit_message()Ramkumar Ramachandra, Jun 9, 2013
  9. 08/15 for-each-ref: get --pretty using format_commit_message()Ramkumar Ramachandra, Jun 9, 2013
  10. 09/15 for-each-ref: teach verify_format() about pretty's syntaxRamkumar Ramachandra, Jun 9, 2013
  11. 10/15 for-each-ref: introduce format specifier %>(*) and %<(*)Ramkumar Ramachandra, Jun 9, 2013
  12. 11/15 for-each-ref: introduce %(HEAD) markerRamkumar Ramachandra, Jun 9, 2013
  13. 12/15 for-each-ref: introduce %(upstream:track[short])Ramkumar Ramachandra, Jun 9, 2013
  14. 13/15 for-each-ref: improve responsiveness of %(upstream:track)Ramkumar Ramachandra, Jun 9, 2013
  15. 14/15 pretty: introduce get_pretty_userformatRamkumar Ramachandra, Jun 9, 2013
  16. 15/15 for-each-ref: use get_pretty_userformat in --prettyRamkumar Ramachandra, Jun 9, 2013
  17. Duy NguyenJun 10, 2013
  18. Ramkumar RamachandraJun 10, 2013
  19. Junio C HamanoJun 10, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.