aboutsummaryrefslogtreecommitdiff
path: root/http-walker.c
diff options
context:
space:
mode:
authorTay Ray Chuan <rctay89@gmail.com>2009-06-06 16:43:36 +0800
committerJunio C Hamano <gitster@pobox.com>2009-06-06 10:56:27 -0700
commit20cfb3aa710d302829a776d7fbad2b89f71f15b6 (patch)
treeb9e4153f98f61b91f7b2b3f86611bdc2fdaa63df /http-walker.c
parent48188c259a7e6c87c20121933287b8c8ca721e3a (diff)
downloadgit-20cfb3aa710d302829a776d7fbad2b89f71f15b6.tar.gz
git-20cfb3aa710d302829a776d7fbad2b89f71f15b6.tar.xz
http*: copy string returned by sha1_to_hex
In the fetch_index implementations in http-push.c and http-walker.c, the string returned by sha1_to_hex is assumed to stay immutable. This patch ensures that hex stays immutable by copying the string returned by sha1_to_hex (via xstrdup) and frees it subsequently. It also refactors free()'s and fclose()'s with labels. Signed-off-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'http-walker.c')
-rw-r--r--http-walker.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/http-walker.c b/http-walker.c
index bbc3023e4..d6cc622e9 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -371,7 +371,8 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
{
- char *hex = sha1_to_hex(sha1);
+ int ret = 0;
+ char *hex = xstrdup(sha1_to_hex(sha1));
char *filename;
char *url;
char tmpfile[PATH_MAX];
@@ -394,18 +395,18 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch
if (start_active_slot(slot)) {
run_active_slot(slot);
if (results.curl_result != CURLE_OK) {
- free(url);
- return error("Unable to verify pack %s is available",
+ ret = error("Unable to verify pack %s is available",
hex);
+ goto cleanup_pack;
}
} else {
- free(url);
- return error("Unable to start request");
+ ret = error("Unable to start request");
+ goto cleanup_pack;
}
if (has_pack_index(sha1)) {
- free(url);
- return 0;
+ ret = 0;
+ goto cleanup_pack;
}
if (walker->get_verbosely)
@@ -417,9 +418,9 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch
snprintf(tmpfile, sizeof(tmpfile), "%s.temp", filename);
indexfile = fopen(tmpfile, "a");
if (!indexfile) {
- free(url);
- return error("Unable to open local file %s for pack index",
- tmpfile);
+ ret = error("Unable to open local file %s for pack index",
+ tmpfile);
+ goto cleanup_pack;
}
slot = get_active_slot();
@@ -450,24 +451,24 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch
if (start_active_slot(slot)) {
run_active_slot(slot);
if (results.curl_result != CURLE_OK) {
- free(url);
- fclose(indexfile);
- slot->local = NULL;
- return error("Unable to get pack index %s\n%s", url,
- curl_errorstr);
+ ret = error("Unable to get pack index %s\n%s", url,
+ curl_errorstr);
+ goto cleanup_index;
}
} else {
- free(url);
- fclose(indexfile);
- slot->local = NULL;
- return error("Unable to start request");
+ ret = error("Unable to start request");
+ goto cleanup_index;
}
- free(url);
+ ret = move_temp_to_file(tmpfile, filename);
+
+cleanup_index:
fclose(indexfile);
slot->local = NULL;
-
- return move_temp_to_file(tmpfile, filename);
+cleanup_pack:
+ free(url);
+ free(hex);
+ return ret;
}
static int setup_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1)