diff options
author | Jeff King <peff@peff.net> | 2014-06-10 17:39:30 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-06-12 10:29:43 -0700 |
commit | b000c59b0c80fc187e5e0e48dc9396cd60576c4e (patch) | |
tree | eceae4f00fdd8ddc384ec7d04739686e7b3ea4e1 | |
parent | 10322a0aaf84382d8901f9ab59e59c39f0c035bb (diff) | |
download | git-b000c59b0c80fc187e5e0e48dc9396cd60576c4e.tar.gz |
logmsg_reencode: return const buffer
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/blame.c | 2 | ||||
-rw-r--r-- | builtin/reset.c | 2 | ||||
-rw-r--r-- | commit.h | 8 | ||||
-rw-r--r-- | pretty.c | 14 | ||||
-rw-r--r-- | revision.c | 13 |
5 files changed, 23 insertions, 16 deletions
diff --git a/builtin/blame.c b/builtin/blame.c index 6e22bdfbfa..85a3681306 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -1405,7 +1405,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 f4e087596b..b5312c4c65 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); @@ -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); @@ -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 71e2337423..be151ef462 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,19 @@ 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; |