diff options
author | Jeff King <peff@peff.net> | 2014-07-24 00:41:30 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-07-24 13:57:50 -0700 |
commit | def0697167d0b3fb3c9cc1a2fcbac56e540aae48 (patch) | |
tree | 67389fc3fc4d5e57cfd931ecd4ddabfebb82439c | |
parent | 28b3563241ac13733781fb0bada37f776a39f43d (diff) | |
download | git-def0697167d0b3fb3c9cc1a2fcbac56e540aae48.tar.gz git-def0697167d0b3fb3c9cc1a2fcbac56e540aae48.tar.xz |
transport: fix leaks in refs_from_alternate_cb
The function starts by creating a copy of the static buffer
returned by real_path, but forgets to free it in the error
code paths. We can solve this by jumping to the cleanup code
that is already there.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | transport.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/transport.c b/transport.c index 325f03e1e..e735633a6 100644 --- a/transport.c +++ b/transport.c @@ -1369,11 +1369,11 @@ static int refs_from_alternate_cb(struct alternate_object_database *e, while (other[len-1] == '/') other[--len] = '\0'; if (len < 8 || memcmp(other + len - 8, "/objects", 8)) - return 0; + goto out; /* Is this a git repository with refs? */ memcpy(other + len - 8, "/refs", 6); if (!is_directory(other)) - return 0; + goto out; other[len - 8] = '\0'; remote = remote_get(other); transport = transport_get(remote, other); @@ -1382,6 +1382,7 @@ static int refs_from_alternate_cb(struct alternate_object_database *e, extra = extra->next) cb->fn(extra, cb->data); transport_disconnect(transport); +out: free(other); return 0; } |