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>
This commit is contained in:
Tay Ray Chuan 2009-06-06 16:43:36 +08:00 committed by Junio C Hamano
parent 48188c259a
commit 20cfb3aa71
2 changed files with 47 additions and 45 deletions

View File

@ -958,7 +958,8 @@ static int add_send_request(struct object *obj, struct remote_lock *lock)
static int fetch_index(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];
@ -980,18 +981,18 @@ static int fetch_index(unsigned char *sha1)
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",
hex);
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 (push_verbosely)
@ -1003,9 +1004,9 @@ static int fetch_index(unsigned char *sha1)
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();
@ -1036,24 +1037,24 @@ static int fetch_index(unsigned char *sha1)
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(unsigned char *sha1)

View File

@ -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)