add_reflog_for_walk: avoid memory leak
We free()d the `log` buffer when dwim_log() returned 1, but not when it returned a larger value (which meant that it still allocated the buffer but we simply ignored it). While in the vicinity, make sure that the `reflogs` structure as well as the `branch` variable are released properly, too. Identified by Coverity. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7c565a6b2d
commit
5026b47175
@ -183,7 +183,11 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
||||
if (!reflogs || reflogs->nr == 0) {
|
||||
struct object_id oid;
|
||||
char *b;
|
||||
if (dwim_log(branch, strlen(branch), oid.hash, &b) == 1) {
|
||||
int ret = dwim_log(branch, strlen(branch),
|
||||
oid.hash, &b);
|
||||
if (ret > 1)
|
||||
free(b);
|
||||
else if (ret == 1) {
|
||||
if (reflogs) {
|
||||
free(reflogs->ref);
|
||||
free(reflogs);
|
||||
@ -193,17 +197,27 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
||||
reflogs = read_complete_reflog(branch);
|
||||
}
|
||||
}
|
||||
if (!reflogs || reflogs->nr == 0)
|
||||
if (!reflogs || reflogs->nr == 0) {
|
||||
if (reflogs) {
|
||||
free(reflogs->ref);
|
||||
free(reflogs);
|
||||
}
|
||||
free(branch);
|
||||
return -1;
|
||||
}
|
||||
string_list_insert(&info->complete_reflogs, branch)->util
|
||||
= reflogs;
|
||||
}
|
||||
free(branch);
|
||||
|
||||
commit_reflog = xcalloc(1, sizeof(struct commit_reflog));
|
||||
if (recno < 0) {
|
||||
commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp);
|
||||
if (commit_reflog->recno < 0) {
|
||||
free(branch);
|
||||
if (reflogs) {
|
||||
free(reflogs->ref);
|
||||
free(reflogs);
|
||||
}
|
||||
free(commit_reflog);
|
||||
return -1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user