diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-02-04 10:25:18 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-02-04 10:25:18 -0800 |
commit | d5365b43274779246665416caf1a51af5a29f776 (patch) | |
tree | 4964cb7640ffec8458d3a56815d0d4c21369f1f6 /builtin | |
parent | 27d46a70724ef5e087863c3db35eb7ca9c084c2c (diff) | |
parent | be5c9fb9049ed470e7005f159bb923a5f4de1309 (diff) | |
download | git-d5365b43274779246665416caf1a51af5a29f776.tar.gz |
Merge branch 'jk/read-commit-buffer-data-after-free'
Clarify the ownership rule for commit->buffer field, which some
callers incorrectly accessed without making sure it is populated.
* jk/read-commit-buffer-data-after-free:
logmsg_reencode: lazily load missing commit buffers
logmsg_reencode: never return NULL
commit: drop useless xstrdup of commit message
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/blame.c | 22 | ||||
-rw-r--r-- | builtin/commit.c | 14 |
2 files changed, 6 insertions, 30 deletions
diff --git a/builtin/blame.c b/builtin/blame.c index b431ba3209..86100e9662 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -1420,32 +1420,18 @@ static void get_commit_info(struct commit *commit, { int len; const char *subject, *encoding; - char *reencoded, *message; + char *message; commit_info_init(ret); - /* - * We've operated without save_commit_buffer, so - * we now need to populate them for output. - */ - if (!commit->buffer) { - enum object_type type; - unsigned long size; - commit->buffer = - read_sha1_file(commit->object.sha1, &type, &size); - if (!commit->buffer) - die("Cannot read commit %s", - sha1_to_hex(commit->object.sha1)); - } encoding = get_log_output_encoding(); - reencoded = logmsg_reencode(commit, encoding); - message = reencoded ? reencoded : commit->buffer; + message = logmsg_reencode(commit, encoding); get_ac_line(message, "\nauthor ", &ret->author, &ret->author_mail, &ret->author_time, &ret->author_tz); if (!detailed) { - free(reencoded); + logmsg_free(message, commit); return; } @@ -1459,7 +1445,7 @@ static void get_commit_info(struct commit *commit, else strbuf_addf(&ret->summary, "(%s)", sha1_to_hex(commit->object.sha1)); - free(reencoded); + logmsg_free(message, commit); } /* diff --git a/builtin/commit.c b/builtin/commit.c index 6c95fa76d8..1a0e5f14a3 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -946,24 +946,14 @@ static void handle_untracked_files_arg(struct wt_status *s) static const char *read_commit_message(const char *name) { - const char *out_enc, *out; + const char *out_enc; struct commit *commit; commit = lookup_commit_reference_by_name(name); if (!commit) die(_("could not lookup commit %s"), name); out_enc = get_commit_output_encoding(); - out = logmsg_reencode(commit, out_enc); - - /* - * If we failed to reencode the buffer, just copy it - * byte for byte so the user can try to fix it up. - * This also handles the case where input and output - * encodings are identical. - */ - if (out == NULL) - out = xstrdup(commit->buffer); - return out; + return logmsg_reencode(commit, out_enc); } static int parse_and_validate_options(int argc, const char *argv[], |