Skip to content

Commit

Permalink
Cleanups, renames, and leak fixes
Browse files Browse the repository at this point in the history
This renames git_vector_free_all to the better git_vector_free_deep
and also contains a couple of memory leak fixes based on valgrind
checks.  The fixes are specifically: failure to free global dir
path variables when not compiled with threading on and failure to
free filters from the filter registry that had not be initialized
fully.
  • Loading branch information
arrbee committed Dec 12, 2013
1 parent 11bd7a0 commit 9cfce27
Show file tree
Hide file tree
Showing 17 changed files with 29 additions and 21 deletions.
1 change: 1 addition & 0 deletions include/git2/sys/filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ typedef int (*git_filter_init_fn)(git_filter *self);
* Specified as `filter.shutdown`, this is an optional callback invoked
* when the filter is unregistered or when libgit2 is shutting down. It
* will be called once at most and should release resources as needed.
* This may be called even if the `initialize` callback was not made.
*
* Typically this function will free the `git_filter` object itself.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/blame.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ void git_blame_free(git_blame *blame)
free_hunk(hunk);
git_vector_free(&blame->hunks);

git_vector_free_all(&blame->paths);
git_vector_free_deep(&blame->paths);

git_array_clear(blame->line_index);

Expand Down
2 changes: 1 addition & 1 deletion src/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -1765,7 +1765,7 @@ static void checkout_data_clear(checkout_data *data)
git_vector_free(&data->removes);
git_pool_clear(&data->pool);

git_vector_free_all(&data->conflicts);
git_vector_free_deep(&data->conflicts);

git__free(data->pfx);
data->pfx = NULL;
Expand Down
2 changes: 1 addition & 1 deletion src/diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ static int diff_list_apply_options(

static void diff_list_free(git_diff *diff)
{
git_vector_free_all(&diff->deltas);
git_vector_free_deep(&diff->deltas);

git_pathspec__vfree(&diff->pathspec);
git_pool_clear(&diff->pool);
Expand Down
4 changes: 2 additions & 2 deletions src/diff_tform.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ int git_diff_merge(git_diff *onto, const git_diff *from)
git_pool_strdup_safe(&onto->pool, onto->opts.new_prefix);
}

git_vector_free_all(&onto_new);
git_vector_free_deep(&onto_new);
git_pool_clear(&onto_pool);

return error;
Expand Down Expand Up @@ -440,7 +440,7 @@ static int apply_splits_and_deletes(
return 0;

on_error:
git_vector_free_all(&onto);
git_vector_free_deep(&onto);

return -1;
}
Expand Down
13 changes: 10 additions & 3 deletions src/fileops.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,8 @@ static git_futils_dirs_guess_cb git_futils__dir_guess[GIT_FUTILS_DIR__MAX] = {
git_futils_guess_template_dirs,
};

static int git_futils__dirs_shutdown_set = 0;

void git_futils_dirs_global_shutdown(void)
{
int i;
Expand All @@ -631,8 +633,6 @@ int git_futils_dirs_global_init(void)
for (i = 0; !error && i < GIT_FUTILS_DIR__MAX; i++)
error = git_futils_dirs_get(&path, i);

git__on_shutdown(git_futils_dirs_global_shutdown);

return error;
}

Expand All @@ -652,9 +652,16 @@ int git_futils_dirs_get(const git_buf **out, git_futils_dir_t which)

GITERR_CHECK_ERROR(git_futils_check_selector(which));

if (!git_buf_len(&git_futils__dirs[which]))
if (!git_buf_len(&git_futils__dirs[which])) {
/* prepare shutdown if we're going to need it */
if (!git_futils__dirs_shutdown_set) {
git__on_shutdown(git_futils_dirs_global_shutdown);
git_futils__dirs_shutdown_set = 1;
}

GITERR_CHECK_ERROR(
git_futils__dir_guess[which](&git_futils__dirs[which]));
}

*out = &git_futils__dirs[which];
return 0;
Expand Down
2 changes: 1 addition & 1 deletion src/filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ static void filter_registry_shutdown(void)
return;

git_vector_foreach(&reg->filters, pos, fdef) {
if (fdef->initialized && fdef->filter && fdef->filter->shutdown) {
if (fdef->filter && fdef->filter->shutdown) {
fdef->filter->shutdown(fdef->filter);
fdef->initialized = false;
}
Expand Down
4 changes: 2 additions & 2 deletions src/indexer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1010,7 +1010,7 @@ void git_indexer_free(git_indexer *idx)
if (idx == NULL)
return;

git_vector_free_all(&idx->objects);
git_vector_free_deep(&idx->objects);

if (idx->pack) {
struct git_pack_entry *pentry;
Expand All @@ -1020,7 +1020,7 @@ void git_indexer_free(git_indexer *idx)
git_oidmap_free(idx->pack->idx_cache);
}

git_vector_free_all(&idx->deltas);
git_vector_free_deep(&idx->deltas);
git_packfile_free(idx->pack);
git_filebuf_cleanup(&idx->pack_file);
git__free(idx);
Expand Down
2 changes: 1 addition & 1 deletion src/iterator.c
Original file line number Diff line number Diff line change
Expand Up @@ -920,7 +920,7 @@ static fs_iterator_frame *fs_iterator__alloc_frame(fs_iterator *fi)

static void fs_iterator__free_frame(fs_iterator_frame *ff)
{
git_vector_free_all(&ff->entries);
git_vector_free_deep(&ff->entries);
git__free(ff);
}

Expand Down
2 changes: 1 addition & 1 deletion src/merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -2383,7 +2383,7 @@ int git_merge__indexes(git_repository *repo, git_index *index_new)
git_index_set_caps(index_repo, index_repo_caps);

git_index_free(index_repo);
git_vector_free_all(&paths);
git_vector_free_deep(&paths);

return error;
}
Expand Down
2 changes: 1 addition & 1 deletion src/pathspec.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ int git_pathspec__vinit(
/* free data from the pathspec vector */
void git_pathspec__vfree(git_vector *vspec)
{
git_vector_free_all(vspec);
git_vector_free_deep(vspec);
}

struct pathspec_match_context {
Expand Down
2 changes: 1 addition & 1 deletion src/push.c
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,7 @@ static int queue_objects(git_push *push)
error = 0;

on_error:
git_vector_free_all(&commits);
git_vector_free_deep(&commits);
return error;
}

Expand Down
4 changes: 2 additions & 2 deletions src/remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -1138,7 +1138,7 @@ int git_remote_list(git_strarray *remotes_list, git_repository *repo)
cfg, "^remote\\..*\\.(push)?url$", remote_list_cb, &list);

if (error < 0) {
git_vector_free_all(&list);
git_vector_free_deep(&list);
return error;
}

Expand Down Expand Up @@ -1617,7 +1617,7 @@ static int copy_refspecs(git_strarray *array, git_remote *remote, unsigned int p
return 0;

on_error:
git_vector_free_all(&refspecs);
git_vector_free_deep(&refspecs);

return -1;
}
Expand Down
2 changes: 1 addition & 1 deletion src/status.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ void git_status_list_free(git_status_list *status)
git_diff_free(status->head2idx);
git_diff_free(status->idx2wd);

git_vector_free_all(&status->paired);
git_vector_free_deep(&status->paired);

git__memzero(status, sizeof(*status));
git__free(status);
Expand Down
2 changes: 1 addition & 1 deletion src/transports/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ static void clear_parser_state(http_subtransport *t)
git__free(t->location);
t->location = NULL;

git_vector_free_all(&t->www_authenticate);
git_vector_free_deep(&t->www_authenticate);
}

static int write_chunk(gitno_socket *socket, const char *buffer, size_t len)
Expand Down
2 changes: 1 addition & 1 deletion src/vector.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ void git_vector_free(git_vector *v)
v->_alloc_size = 0;
}

void git_vector_free_all(git_vector *v)
void git_vector_free_deep(git_vector *v)
{
size_t i;

Expand Down
2 changes: 1 addition & 1 deletion src/vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ typedef struct git_vector {

int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp);
void git_vector_free(git_vector *v);
void git_vector_free_all(git_vector *v); /* free each entry and self */
void git_vector_free_deep(git_vector *v); /* free each entry and self */
void git_vector_clear(git_vector *v);
int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp);
void git_vector_swap(git_vector *a, git_vector *b);
Expand Down

0 comments on commit 9cfce27

Please sign in to comment.