mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-14 15:30:43 +00:00
Merge pull request #4226 from libgit2/ethomson/memleak
WIP: squash some memleaks
This commit is contained in:
commit
9cc0ba6bab
10
src/branch.c
10
src/branch.c
@ -130,14 +130,16 @@ int git_branch_create_from_annotated(
|
|||||||
static int branch_equals(git_repository *repo, const char *path, void *payload)
|
static int branch_equals(git_repository *repo, const char *path, void *payload)
|
||||||
{
|
{
|
||||||
git_reference *branch = (git_reference *) payload;
|
git_reference *branch = (git_reference *) payload;
|
||||||
git_reference *head;
|
git_reference *head = NULL;
|
||||||
int equal;
|
int equal = 0;
|
||||||
|
|
||||||
if (git_reference__read_head(&head, repo, path) < 0 ||
|
if (git_reference__read_head(&head, repo, path) < 0 ||
|
||||||
git_reference_type(head) != GIT_REF_SYMBOLIC)
|
git_reference_type(head) != GIT_REF_SYMBOLIC)
|
||||||
return 0;
|
goto done;
|
||||||
|
|
||||||
equal = !git__strcmp(head->target.symbolic, branch->name);
|
equal = !git__strcmp(head->target.symbolic, branch->name);
|
||||||
|
|
||||||
|
done:
|
||||||
git_reference_free(head);
|
git_reference_free(head);
|
||||||
return equal;
|
return equal;
|
||||||
}
|
}
|
||||||
|
@ -205,6 +205,11 @@ static int start_inflate(z_stream *s, git_buf *obj, void *out, size_t len)
|
|||||||
return inflate(s, 0);
|
return inflate(s, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void abort_inflate(z_stream *s)
|
||||||
|
{
|
||||||
|
inflateEnd(s);
|
||||||
|
}
|
||||||
|
|
||||||
static int finish_inflate(z_stream *s)
|
static int finish_inflate(z_stream *s)
|
||||||
{
|
{
|
||||||
int status = Z_OK;
|
int status = Z_OK;
|
||||||
@ -367,6 +372,7 @@ static int inflate_disk_obj(git_rawobj *out, git_buf *obj)
|
|||||||
(used = get_object_header(&hdr, head)) == 0 ||
|
(used = get_object_header(&hdr, head)) == 0 ||
|
||||||
!git_object_typeisloose(hdr.type))
|
!git_object_typeisloose(hdr.type))
|
||||||
{
|
{
|
||||||
|
abort_inflate(&zs);
|
||||||
giterr_set(GITERR_ODB, "failed to inflate disk object");
|
giterr_set(GITERR_ODB, "failed to inflate disk object");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -277,8 +277,8 @@ int git_reference__read_head(
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
free(name);
|
git__free(name);
|
||||||
git_buf_clear(&reference);
|
git_buf_free(&reference);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
16
src/remote.c
16
src/remote.c
@ -192,7 +192,7 @@ static int canonicalize_url(git_buf *out, const char *in)
|
|||||||
static int create_internal(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch)
|
static int create_internal(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch)
|
||||||
{
|
{
|
||||||
git_remote *remote;
|
git_remote *remote;
|
||||||
git_config *config = NULL;
|
git_config *config_ro = NULL, *config_rw;
|
||||||
git_buf canonical_url = GIT_BUF_INIT;
|
git_buf canonical_url = GIT_BUF_INIT;
|
||||||
git_buf var = GIT_BUF_INIT;
|
git_buf var = GIT_BUF_INIT;
|
||||||
int error = -1;
|
int error = -1;
|
||||||
@ -200,7 +200,7 @@ static int create_internal(git_remote **out, git_repository *repo, const char *n
|
|||||||
/* name is optional */
|
/* name is optional */
|
||||||
assert(out && repo && url);
|
assert(out && repo && url);
|
||||||
|
|
||||||
if ((error = git_repository_config__weakptr(&config, repo)) < 0)
|
if ((error = git_repository_config_snapshot(&config_ro, repo)) < 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
remote = git__calloc(1, sizeof(git_remote));
|
remote = git__calloc(1, sizeof(git_remote));
|
||||||
@ -212,7 +212,8 @@ static int create_internal(git_remote **out, git_repository *repo, const char *n
|
|||||||
(error = canonicalize_url(&canonical_url, url)) < 0)
|
(error = canonicalize_url(&canonical_url, url)) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
remote->url = apply_insteadof(repo->_config, canonical_url.ptr, GIT_DIRECTION_FETCH);
|
remote->url = apply_insteadof(config_ro, canonical_url.ptr, GIT_DIRECTION_FETCH);
|
||||||
|
GITERR_CHECK_ALLOC(remote->url);
|
||||||
|
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
remote->name = git__strdup(name);
|
remote->name = git__strdup(name);
|
||||||
@ -221,7 +222,8 @@ static int create_internal(git_remote **out, git_repository *repo, const char *n
|
|||||||
if ((error = git_buf_printf(&var, CONFIG_URL_FMT, name)) < 0)
|
if ((error = git_buf_printf(&var, CONFIG_URL_FMT, name)) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
if ((error = git_config_set_string(config, var.ptr, canonical_url.ptr)) < 0)
|
if ((error = git_repository_config__weakptr(&config_rw, repo)) < 0 ||
|
||||||
|
(error = git_config_set_string(config_rw, var.ptr, canonical_url.ptr)) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,10 +235,7 @@ static int create_internal(git_remote **out, git_repository *repo, const char *n
|
|||||||
if (name && (error = write_add_refspec(repo, name, fetch, true)) < 0)
|
if (name && (error = write_add_refspec(repo, name, fetch, true)) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
if ((error = git_repository_config_snapshot(&config, repo)) < 0)
|
if ((error = lookup_remote_prune_config(remote, config_ro, name)) < 0)
|
||||||
goto on_error;
|
|
||||||
|
|
||||||
if ((error = lookup_remote_prune_config(remote, config, name)) < 0)
|
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
/* Move the data over to where the matching functions can find them */
|
/* Move the data over to where the matching functions can find them */
|
||||||
@ -260,6 +259,7 @@ on_error:
|
|||||||
if (error)
|
if (error)
|
||||||
git_remote_free(remote);
|
git_remote_free(remote);
|
||||||
|
|
||||||
|
git_config_free(config_ro);
|
||||||
git_buf_free(&canonical_url);
|
git_buf_free(&canonical_url);
|
||||||
git_buf_free(&var);
|
git_buf_free(&var);
|
||||||
return error;
|
return error;
|
||||||
|
@ -2132,7 +2132,8 @@ int git_repository_head_for_worktree(git_reference **out, git_repository *repo,
|
|||||||
out:
|
out:
|
||||||
if (error)
|
if (error)
|
||||||
git_reference_free(head);
|
git_reference_free(head);
|
||||||
git_buf_clear(&path);
|
|
||||||
|
git_buf_free(&path);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -228,8 +228,11 @@ int git_signature__parse(git_signature *sig, const char **buffer_out,
|
|||||||
const char *time_start = email_end + 2;
|
const char *time_start = email_end + 2;
|
||||||
const char *time_end;
|
const char *time_end;
|
||||||
|
|
||||||
if (git__strtol64(&sig->when.time, time_start, &time_end, 10) < 0)
|
if (git__strtol64(&sig->when.time, time_start, &time_end, 10) < 0) {
|
||||||
|
git__free(sig->name);
|
||||||
|
git__free(sig->email);
|
||||||
return signature_error("invalid Unix timestamp");
|
return signature_error("invalid Unix timestamp");
|
||||||
|
}
|
||||||
|
|
||||||
/* do we have a timezone? */
|
/* do we have a timezone? */
|
||||||
if (time_end + 1 < buffer_end) {
|
if (time_end + 1 < buffer_end) {
|
||||||
|
@ -116,6 +116,7 @@ void test_object_lookup__lookup_object_with_wrong_hash_returns_error(void)
|
|||||||
cl_git_pass(git_object_lookup(&object, g_repo, &oid, GIT_OBJ_COMMIT));
|
cl_git_pass(git_object_lookup(&object, g_repo, &oid, GIT_OBJ_COMMIT));
|
||||||
cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 1));
|
cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 1));
|
||||||
|
|
||||||
|
git_object_free(object);
|
||||||
git_buf_free(&oldpath);
|
git_buf_free(&oldpath);
|
||||||
git_buf_free(&newpath);
|
git_buf_free(&newpath);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user