From 3a462bc9ba8cc46dcd5e49ae884968e1921c265f Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Mon, 10 Dec 2007 22:36:11 +0100 Subject: [PATCH] Fix various memory leaks in http-push.c and http-walker.c Signed-off-by: Mike Hommey Signed-off-by: Junio C Hamano --- http-push.c | 33 ++++++++++++++++++++------------- http-walker.c | 40 +++++++++++++++++++++++++--------------- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/http-push.c b/http-push.c index 0257291b9b..af00ea10b9 100644 --- a/http-push.c +++ b/http-push.c @@ -1119,6 +1119,7 @@ int fetch_ref(char *ref, unsigned char *sha1) char *base = remote->url; struct active_request_slot *slot; struct slot_results results; + int ret; url = quote_ref_url(base, ref); slot = get_active_slot(); @@ -1129,19 +1130,23 @@ int fetch_ref(char *ref, unsigned char *sha1) curl_easy_setopt(slot->curl, CURLOPT_URL, url); if (start_active_slot(slot)) { run_active_slot(slot); - free(url); - if (results.curl_result != CURLE_OK) - return error("Couldn't get %s for %s\n%s", - url, ref, curl_errorstr); + if (results.curl_result == CURLE_OK) { + strbuf_rtrim(&buffer); + if (buffer.len == 40) + ret = get_sha1_hex(buffer.buf, sha1); + else + ret = 1; + } else { + ret = error("Couldn't get %s for %s\n%s", + url, ref, curl_errorstr); + } } else { - free(url); - return error("Unable to start request"); + ret = error("Unable to start request"); } - strbuf_rtrim(&buffer); - if (buffer.len != 40) - return 1; - return get_sha1_hex(buffer.buf, sha1); + strbuf_release(&buffer); + free(url); + return ret; } static void one_remote_object(const char *hex) @@ -2043,6 +2048,7 @@ static int remote_exists(const char *path) char *url = xmalloc(strlen(remote->url) + strlen(path) + 1); struct active_request_slot *slot; struct slot_results results; + int ret = -1; sprintf(url, "%s%s", remote->url, path); @@ -2055,9 +2061,9 @@ static int remote_exists(const char *path) run_active_slot(slot); free(url); if (results.http_code == 404) - return 0; + ret = 0; else if (results.curl_result == CURLE_OK) - return 1; + ret = 1; else fprintf(stderr, "HEAD HTTP error %ld\n", results.http_code); } else { @@ -2065,7 +2071,8 @@ static int remote_exists(const char *path) fprintf(stderr, "Unable to start HEAD request\n"); } - return -1; + free(url); + return ret; } static void fetch_symref(const char *path, char **symref, unsigned char *sha1) diff --git a/http-walker.c b/http-walker.c index 8dbf9cc369..4e878b3c8f 100644 --- a/http-walker.c +++ b/http-walker.c @@ -644,6 +644,7 @@ static int fetch_indices(struct walker *walker, struct alt_base *repo) struct strbuf buffer = STRBUF_INIT; char *data; int i = 0; + int ret = 0; struct active_request_slot *slot; struct slot_results results; @@ -666,19 +667,19 @@ static int fetch_indices(struct walker *walker, struct alt_base *repo) if (start_active_slot(slot)) { run_active_slot(slot); if (results.curl_result != CURLE_OK) { - strbuf_release(&buffer); if (missing_target(&results)) { repo->got_indices = 1; - return 0; + goto cleanup; } else { repo->got_indices = 0; - return error("%s", curl_errorstr); + ret = error("%s", curl_errorstr); + goto cleanup; } } } else { repo->got_indices = 0; - strbuf_release(&buffer); - return error("Unable to start request"); + ret = error("Unable to start request"); + goto cleanup; } data = buffer.buf; @@ -701,9 +702,11 @@ static int fetch_indices(struct walker *walker, struct alt_base *repo) i++; } - strbuf_release(&buffer); repo->got_indices = 1; - return 0; +cleanup: + strbuf_release(&buffer); + free(url); + return ret; } static int fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1) @@ -939,6 +942,7 @@ static int fetch_ref(struct walker *walker, char *ref, unsigned char *sha1) const char *base = data->alt->base; struct active_request_slot *slot; struct slot_results results; + int ret; url = quote_ref_url(base, ref); slot = get_active_slot(); @@ -949,17 +953,23 @@ static int fetch_ref(struct walker *walker, char *ref, unsigned char *sha1) curl_easy_setopt(slot->curl, CURLOPT_URL, url); if (start_active_slot(slot)) { run_active_slot(slot); - if (results.curl_result != CURLE_OK) - return error("Couldn't get %s for %s\n%s", - url, ref, curl_errorstr); + if (results.curl_result == CURLE_OK) { + strbuf_rtrim(&buffer); + if (buffer.len == 40) + ret = get_sha1_hex(buffer.buf, sha1); + else + ret = 1; + } else { + ret = error("Couldn't get %s for %s\n%s", + url, ref, curl_errorstr); + } } else { - return error("Unable to start request"); + ret = error("Unable to start request"); } - strbuf_rtrim(&buffer); - if (buffer.len != 40) - return 1; - return get_sha1_hex(buffer.buf, sha1); + strbuf_release(&buffer); + free(url); + return ret; } static void cleanup(struct walker *walker) -- 2.11.4.GIT