Skip to content

Commit 5341230

Browse files
committed
tree: plug leaks in the tree updater
1 parent 6ee08d2 commit 5341230

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

src/tree.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,22 +1216,29 @@ int git_tree_create_updated(git_oid *out, git_repository *repo, git_tree *baseli
12161216
{
12171217
/* Make sure we're replacing something of the same type */
12181218
tree_stack_entry *last = git_array_last(stack);
1219-
const char *basename = git_path_basename(update->path);
1219+
char *basename = git_path_basename(update->path);
12201220
const git_tree_entry *e = git_treebuilder_get(last->bld, basename);
12211221
if (e && git_tree_entry_type(e) != git_object__type_from_filemode(update->filemode)) {
1222+
git__free(basename);
12221223
giterr_set(GITERR_TREE, "Cannot replace '%s' with '%s' at '%s'",
12231224
git_object_type2string(git_tree_entry_type(e)),
12241225
git_object_type2string(git_object__type_from_filemode(update->filemode)),
12251226
update->path);
1226-
return -1;
1227+
error = -1;
1228+
goto cleanup;
12271229
}
12281230

12291231
error = git_treebuilder_insert(NULL, last->bld, basename, &update->id, update->filemode);
1232+
git__free(basename);
12301233
break;
12311234
}
12321235
case GIT_TREE_UPDATE_REMOVE:
1233-
error = git_treebuilder_remove(git_array_last(stack)->bld, git_path_basename(update->path));
1236+
{
1237+
char *basename = git_path_basename(update->path);
1238+
error = git_treebuilder_remove(git_array_last(stack)->bld, basename);
1239+
git__free(basename);
12341240
break;
1241+
}
12351242
default:
12361243
giterr_set(GITERR_TREE, "unkown action for update");
12371244
error = -1;
@@ -1275,6 +1282,7 @@ int git_tree_create_updated(git_oid *out, git_repository *repo, git_tree *baseli
12751282
}
12761283
}
12771284

1285+
git_buf_free(&component);
12781286
git_array_clear(stack);
12791287
git_vector_free(&entries);
12801288
return error;

tests/object/tree/update.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ void test_object_tree_update__add_blobs(void)
127127
};
128128

129129
cl_git_pass(git_oid_fromstr(&base_id, "c4dc1555e4d4fa0e0c9c3fc46734c7c35b3ce90b"));
130-
cl_git_pass(git_tree_lookup(&base_tree, g_repo, &base_id));
131130

132131
entry.mode = GIT_FILEMODE_BLOB;
133132
cl_git_pass(git_oid_fromstr(&entry.id, "fa49b077972391ad58037050f2a75f74e3671e92"));
@@ -161,6 +160,8 @@ void test_object_tree_update__add_blobs(void)
161160

162161
cl_assert_equal_oid(&tree_index_id, &tree_updater_id);
163162
}
163+
164+
git_tree_free(base_tree);
164165
}
165166

166167
void test_object_tree_update__add_conflict(void)

0 commit comments

Comments
 (0)