summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2011-09-30 18:35:33 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2011-10-01 00:41:09 +0200
commita28889198cf9565944aa0ff983459c6bf6eec311 (patch)
treee4d3422690b3380e400e812a2a9062b69eaf1880
parentccc9872d4df7ca6cd44f777c0600c4b1fab0f9e6 (diff)
downloadlibgit2-a28889198cf9565944aa0ff983459c6bf6eec311.tar.gz
local transport: don't segfault on wrong URL
memset the structure on initialisation and don't try to dereference the vector with the heads if we didn't find a repository. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
-rw-r--r--src/transport_local.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/transport_local.c b/src/transport_local.c
index 4975af9ad..7e932f846 100644
--- a/src/transport_local.c
+++ b/src/transport_local.c
@@ -201,16 +201,19 @@ static void local_free(git_transport *transport)
unsigned int i;
transport_local *t = (transport_local *) transport;
git_vector *vec = t->refs;
+ git_remote_head *h;
assert(transport);
- for (i = 0; i < vec->length; ++i) {
- git_remote_head *h = git_vector_get(vec, i);
- free(h->name);
- free(h);
+ if (t->refs != NULL) {
+ git_vector_foreach (vec, i, h) {
+ free(h->name);
+ free(h);
+ }
+ git_vector_free(vec);
+ free(vec);
}
- git_vector_free(vec);
- free(vec);
+
git_repository_free(t->repo);
free(t->parent.url);
free(t);
@@ -228,6 +231,8 @@ int git_transport_local(git_transport **out)
if (t == NULL)
return GIT_ENOMEM;
+ memset(t, 0x0, sizeof(transport_local));
+
t->parent.connect = local_connect;
t->parent.ls = local_ls;
t->parent.send_wants = local_send_wants;