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

[PATCH 04/15] logmsg_reencode: return const buffer

From
Jeff King <peff@peff.net>
Date
Jun 9, 2014, 18:10 UTC
Message-ID
<20140609181017.GD20315@sigill.intra.peff.net>
In-Reply-To
<20140609180236.GA24644@sigill.intra.peff.net>

The return value from logmsg_reencode may be either a newly allocated buffer or a pointer to the existing commit->buffer. We would not want the caller to accidentally free() or modify the latter, so let's mark it as const. We can cast away the constness in logmsg_free, but only once we have determined that it is a free-able buffer.

Signed-off-by: Jeff King <peff@peff.net>
---
 builtin/blame.c |  2 +-
 builtin/reset.c |  2 +-
 commit.h        |  8 ++++----
 pretty.c        | 14 +++++++-------
 revision.c      | 12 +++++++++---
 5 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/builtin/blame.c b/builtin/blame.c
index d6056a5..6ce3c6d 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1655,7 +1655,7 @@ static void get_commit_info(struct commit *commit,
 {
 	int len;
 	const char *subject, *encoding;
-	char *message;
+	const char *message;
 
 	commit_info_init(ret);
 
diff --git a/builtin/reset.c b/builtin/reset.c
index f368266..7ebee07 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -93,7 +93,7 @@ static int reset_index(const unsigned char *sha1, int reset_type, int quiet)
 static void print_new_head_line(struct commit *commit)
 {
 	const char *hex, *body;
-	char *msg;
+	const char *msg;
 
 	hex = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
 	printf(_("HEAD is now at %s"), hex);
diff --git a/commit.h b/commit.h
index a9f177b..de57df9 100644
--- a/commit.h
+++ b/commit.h
@@ -115,10 +115,10 @@ struct userformat_want {
 
 extern int has_non_ascii(const char *text);
 struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
-extern char *logmsg_reencode(const struct commit *commit,
-			     char **commit_encoding,
-			     const char *output_encoding);
-extern void logmsg_free(char *msg, const struct commit *commit);
+extern const char *logmsg_reencode(const struct commit *commit,
+				   char **commit_encoding,
+				   const char *output_encoding);
+extern void logmsg_free(const char *msg, const struct commit *commit);
 extern void get_commit_format(const char *arg, struct rev_info *);
 extern const char *format_subject(struct strbuf *sb, const char *msg,
 				  const char *line_separator);
diff --git a/pretty.c b/pretty.c
index e1e2cad..d152de2 100644
--- a/pretty.c
+++ b/pretty.c
@@ -606,9 +606,9 @@ static char *replace_encoding_header(char *buf, const char *encoding)
 	return strbuf_detach(&tmp, NULL);
 }
 
-char *logmsg_reencode(const struct commit *commit,
-		      char **commit_encoding,
-		      const char *output_encoding)
+const char *logmsg_reencode(const struct commit *commit,
+			    char **commit_encoding,
+			    const char *output_encoding)
 {
 	static const char *utf8 = "UTF-8";
 	const char *use_encoding;
@@ -687,10 +687,10 @@ char *logmsg_reencode(const struct commit *commit,
 	return out ? out : msg;
 }
 
-void logmsg_free(char *msg, const struct commit *commit)
+void logmsg_free(const char *msg, const struct commit *commit)
 {
 	if (msg != commit->buffer)
-		free(msg);
+		free((void *)msg);
 }
 
 static int mailmap_name(const char **email, size_t *email_len,
@@ -796,7 +796,7 @@ struct format_commit_context {
 	struct signature_check signature_check;
 	enum flush_type flush_type;
 	enum trunc_type truncate;
-	char *message;
+	const char *message;
 	char *commit_encoding;
 	size_t width, indent1, indent2;
 	int auto_color;
@@ -1700,7 +1700,7 @@ void pretty_print_commit(struct pretty_print_context *pp,
 	unsigned long beginning_of_body;
 	int indent = 4;
 	const char *msg;
-	char *reencoded;
+	const char *reencoded;
 	const char *encoding;
 	int need_8bit_cte = pp->need_8bit_cte;
 
diff --git a/revision.c b/revision.c
index 71e2337..47e5b7a 100644
--- a/revision.c
+++ b/revision.c
@@ -2788,7 +2788,7 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
 {
 	int retval;
 	const char *encoding;
-	char *message;
+	const char *message;
 	struct strbuf buf = STRBUF_INIT;
 
 	if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list)
@@ -2830,12 +2830,18 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
 		format_display_notes(commit->object.sha1, &buf, encoding, 1);
 	}
 
-	/* Find either in the original commit message, or in the temporary */
+	/* Find either in the original commit message, or in the temporary.
+	 * Note that we cast away the constness of "message" here. It is
+	 * const because it may come from the cached commit buffer. That's OK,
+	 * because we know that it is modifiable heap memory, and that while
+	 * grep_buffer may modify it for speed, it will restore any
+	 * changes before returning.
+	 */
 	if (buf.len)
 		retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len);
 	else
 		retval = grep_buffer(&opt->grep_filter,
-				     message, strlen(message));
+				     (char *)message, strlen(message));
 	strbuf_release(&buf);
 	logmsg_free(message, commit);
 	return retval;
-- 
2.0.0.729.g520999f
Previous: Jeff KingNext: Eric Sunshine
Message 8 of 60 in “store length of commit->buffer”
  1. 0/15 store length of commit->bufferJeff King, Jun 9, 2014
  2. 01/15 alloc: include any-object allocations in alloc_reportJeff King, Jun 9, 2014
  3. 02/15 commit: push commit_index update into alloc_commit_nodeJeff King, Jun 9, 2014
  4. Junio C HamanoJun 10, 2014
  5. 03/15 do not create "struct commit" with xcallocJeff King, Jun 9, 2014
  6. Junio C HamanoJun 10, 2014
  7. Jeff KingJun 10, 2014
  8. 04/15 logmsg_reencode: return const bufferJeff King, Jun 9, 2014
  9. Eric SunshineJun 10, 2014
  10. 05/15 sequencer: use logmsg_reencode in get_messageJeff King, Jun 9, 2014
  11. Junio C HamanoJun 10, 2014
  12. Jeff KingJun 10, 2014
  13. 06/15 provide a helper to free commit bufferJeff King, Jun 9, 2014
  14. 07/15 provide a helper to set the commit bufferJeff King, Jun 9, 2014
  15. 08/15 provide helpers to access the commit bufferJeff King, Jun 9, 2014
  16. Eric SunshineJun 10, 2014
  17. 09/15 use get_cached_commit_buffer where appropriateJeff King, Jun 9, 2014
  18. 10/15 use get_commit_buffer to avoid duplicate codeJeff King, Jun 9, 2014
  19. Eric SunshineJun 10, 2014
  20. Jeff KingJun 10, 2014
  21. 11/15 convert logmsg_reencode to get_commit_bufferJeff King, Jun 9, 2014
  22. 12/15 use get_commit_buffer everywhereJeff King, Jun 9, 2014
  23. Junio C HamanoJun 9, 2014
  24. Jeff KingJun 10, 2014
  25. Jeff KingJun 10, 2014
  26. Junio C HamanoJun 10, 2014
  27. Jeff KingJun 10, 2014
  28. 13/15 commit-slab: provide a static initializerJeff King, Jun 9, 2014
  29. 14/15 commit: convert commit->buffer to a slabJeff King, Jun 9, 2014
  30. 15/15 commit: record buffer length in cacheJeff King, Jun 9, 2014
  31. Christian CouderJun 10, 2014
  32. Jeff KingJun 10, 2014
  33. Jeff KingJun 10, 2014
  34. Christian CouderJun 10, 2014
  35. 0/17 store length of commit->bufferJeff King, Jun 10, 2014
  36. 01/17 commit_tree: take a pointer/len pair rather than a const strbufJeff King, Jun 10, 2014
  37. 02/17 replace dangerous uses of strbuf_attachJeff King, Jun 10, 2014
  38. 03/17 alloc: include any-object allocations in alloc_reportJeff King, Jun 10, 2014
  39. 04/17 commit: push commit_index update into alloc_commit_nodeJeff King, Jun 10, 2014
  40. 05/17 do not create "struct commit" with xcallocJeff King, Jun 10, 2014
  41. 06/17 logmsg_reencode: return const bufferJeff King, Jun 10, 2014
  42. 07/17 sequencer: use logmsg_reencode in get_messageJeff King, Jun 10, 2014
  43. 08/17 provide a helper to free commit bufferJeff King, Jun 10, 2014
  44. Junio C HamanoJun 12, 2014
  45. Jeff KingJun 12, 2014
  46. Jeff KingJun 12, 2014
  47. 09/17 provide a helper to set the commit bufferJeff King, Jun 10, 2014
  48. 10/17 provide helpers to access the commit bufferJeff King, Jun 10, 2014
  49. 11/17 use get_cached_commit_buffer where appropriateJeff King, Jun 10, 2014
  50. 12/17 use get_commit_buffer to avoid duplicate codeJeff King, Jun 10, 2014
  51. 13/17 convert logmsg_reencode to get_commit_bufferJeff King, Jun 10, 2014
  52. 14/17 use get_commit_buffer everywhereJeff King, Jun 10, 2014
  53. 15/17 commit-slab: provide a static initializerJeff King, Jun 10, 2014
  54. Junio C HamanoJun 12, 2014
  55. Jeff KingJun 12, 2014
  56. 16/17 commit: convert commit->buffer to a slabJeff King, Jun 10, 2014
  57. 17/17 commit: record buffer length in cacheJeff King, Jun 10, 2014
  58. Jeff KingJun 10, 2014
  59. Junio C HamanoJun 12, 2014
  60. reuse cached commit buffer when parsing signaturesJeff King, Jun 13, 2014

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.