mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
Merge branch 'jk/am-leakfix' into maint
The codepath in "git am" that is used when running "git rebase" leaked memory held for the log message of the commits being rebased. * jk/am-leakfix: am: shorten ident_split variable name in get_commit_info() am: simplify allocations in get_commit_info() am: fix commit buffer leak in get_commit_info()
This commit is contained in:
commit
70d19a436d
34
builtin/am.c
34
builtin/am.c
|
@ -1372,40 +1372,33 @@ static int get_mail_commit_oid(struct object_id *commit_id, const char *mail)
|
||||||
*/
|
*/
|
||||||
static void get_commit_info(struct am_state *state, struct commit *commit)
|
static void get_commit_info(struct am_state *state, struct commit *commit)
|
||||||
{
|
{
|
||||||
const char *buffer, *ident_line, *author_date, *msg;
|
const char *buffer, *ident_line, *msg;
|
||||||
size_t ident_len;
|
size_t ident_len;
|
||||||
struct ident_split ident_split;
|
struct ident_split id;
|
||||||
struct strbuf sb = STRBUF_INIT;
|
|
||||||
|
|
||||||
buffer = logmsg_reencode(commit, NULL, get_commit_output_encoding());
|
buffer = logmsg_reencode(commit, NULL, get_commit_output_encoding());
|
||||||
|
|
||||||
ident_line = find_commit_header(buffer, "author", &ident_len);
|
ident_line = find_commit_header(buffer, "author", &ident_len);
|
||||||
|
|
||||||
if (split_ident_line(&ident_split, ident_line, ident_len) < 0) {
|
if (split_ident_line(&id, ident_line, ident_len) < 0)
|
||||||
strbuf_add(&sb, ident_line, ident_len);
|
die(_("invalid ident line: %.*s"), (int)ident_len, ident_line);
|
||||||
die(_("invalid ident line: %s"), sb.buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(!state->author_name);
|
assert(!state->author_name);
|
||||||
if (ident_split.name_begin) {
|
if (id.name_begin)
|
||||||
strbuf_add(&sb, ident_split.name_begin,
|
state->author_name =
|
||||||
ident_split.name_end - ident_split.name_begin);
|
xmemdupz(id.name_begin, id.name_end - id.name_begin);
|
||||||
state->author_name = strbuf_detach(&sb, NULL);
|
else
|
||||||
} else
|
|
||||||
state->author_name = xstrdup("");
|
state->author_name = xstrdup("");
|
||||||
|
|
||||||
assert(!state->author_email);
|
assert(!state->author_email);
|
||||||
if (ident_split.mail_begin) {
|
if (id.mail_begin)
|
||||||
strbuf_add(&sb, ident_split.mail_begin,
|
state->author_email =
|
||||||
ident_split.mail_end - ident_split.mail_begin);
|
xmemdupz(id.mail_begin, id.mail_end - id.mail_begin);
|
||||||
state->author_email = strbuf_detach(&sb, NULL);
|
else
|
||||||
} else
|
|
||||||
state->author_email = xstrdup("");
|
state->author_email = xstrdup("");
|
||||||
|
|
||||||
author_date = show_ident_date(&ident_split, DATE_MODE(NORMAL));
|
|
||||||
strbuf_addstr(&sb, author_date);
|
|
||||||
assert(!state->author_date);
|
assert(!state->author_date);
|
||||||
state->author_date = strbuf_detach(&sb, NULL);
|
state->author_date = xstrdup(show_ident_date(&id, DATE_MODE(NORMAL)));
|
||||||
|
|
||||||
assert(!state->msg);
|
assert(!state->msg);
|
||||||
msg = strstr(buffer, "\n\n");
|
msg = strstr(buffer, "\n\n");
|
||||||
|
@ -1413,6 +1406,7 @@ static void get_commit_info(struct am_state *state, struct commit *commit)
|
||||||
die(_("unable to parse commit %s"), oid_to_hex(&commit->object.oid));
|
die(_("unable to parse commit %s"), oid_to_hex(&commit->object.oid));
|
||||||
state->msg = xstrdup(msg + 2);
|
state->msg = xstrdup(msg + 2);
|
||||||
state->msg_len = strlen(state->msg);
|
state->msg_len = strlen(state->msg);
|
||||||
|
unuse_commit_buffer(commit, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue