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) 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 *filename;
char *url; char *url;
char tmpfile[PATH_MAX]; char tmpfile[PATH_MAX];
@ -980,18 +981,18 @@ static int fetch_index(unsigned char *sha1)
if (start_active_slot(slot)) { if (start_active_slot(slot)) {
run_active_slot(slot); run_active_slot(slot);
if (results.curl_result != CURLE_OK) { if (results.curl_result != CURLE_OK) {
free(url); ret = error("Unable to verify pack %s is available",
return error("Unable to verify pack %s is available", hex);
hex); goto cleanup_pack;
} }
} else { } else {
free(url); ret = error("Unable to start request");
return error("Unable to start request"); goto cleanup_pack;
} }
if (has_pack_index(sha1)) { if (has_pack_index(sha1)) {
free(url); ret = 0;
return 0; goto cleanup_pack;
} }
if (push_verbosely) if (push_verbosely)
@ -1003,9 +1004,9 @@ static int fetch_index(unsigned char *sha1)
snprintf(tmpfile, sizeof(tmpfile), "%s.temp", filename); snprintf(tmpfile, sizeof(tmpfile), "%s.temp", filename);
indexfile = fopen(tmpfile, "a"); indexfile = fopen(tmpfile, "a");
if (!indexfile) { if (!indexfile) {
free(url); ret = error("Unable to open local file %s for pack index",
return error("Unable to open local file %s for pack index", tmpfile);
tmpfile); goto cleanup_pack;
} }
slot = get_active_slot(); slot = get_active_slot();
@ -1036,24 +1037,24 @@ static int fetch_index(unsigned char *sha1)
if (start_active_slot(slot)) { if (start_active_slot(slot)) {
run_active_slot(slot); run_active_slot(slot);
if (results.curl_result != CURLE_OK) { if (results.curl_result != CURLE_OK) {
free(url); ret = error("Unable to get pack index %s\n%s", url,
fclose(indexfile); curl_errorstr);
slot->local = NULL; goto cleanup_index;
return error("Unable to get pack index %s\n%s", url,
curl_errorstr);
} }
} else { } else {
free(url); ret = error("Unable to start request");
fclose(indexfile); goto cleanup_index;
slot->local = NULL;
return error("Unable to start request");
} }
free(url); ret = move_temp_to_file(tmpfile, filename);
cleanup_index:
fclose(indexfile); fclose(indexfile);
slot->local = NULL; slot->local = NULL;
cleanup_pack:
return move_temp_to_file(tmpfile, filename); free(url);
free(hex);
return ret;
} }
static int setup_index(unsigned char *sha1) 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) 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 *filename;
char *url; char *url;
char tmpfile[PATH_MAX]; 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)) { if (start_active_slot(slot)) {
run_active_slot(slot); run_active_slot(slot);
if (results.curl_result != CURLE_OK) { if (results.curl_result != CURLE_OK) {
free(url); ret = error("Unable to verify pack %s is available",
return error("Unable to verify pack %s is available",
hex); hex);
goto cleanup_pack;
} }
} else { } else {
free(url); ret = error("Unable to start request");
return error("Unable to start request"); goto cleanup_pack;
} }
if (has_pack_index(sha1)) { if (has_pack_index(sha1)) {
free(url); ret = 0;
return 0; goto cleanup_pack;
} }
if (walker->get_verbosely) 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); snprintf(tmpfile, sizeof(tmpfile), "%s.temp", filename);
indexfile = fopen(tmpfile, "a"); indexfile = fopen(tmpfile, "a");
if (!indexfile) { if (!indexfile) {
free(url); ret = error("Unable to open local file %s for pack index",
return error("Unable to open local file %s for pack index", tmpfile);
tmpfile); goto cleanup_pack;
} }
slot = get_active_slot(); 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)) { if (start_active_slot(slot)) {
run_active_slot(slot); run_active_slot(slot);
if (results.curl_result != CURLE_OK) { if (results.curl_result != CURLE_OK) {
free(url); ret = error("Unable to get pack index %s\n%s", url,
fclose(indexfile); curl_errorstr);
slot->local = NULL; goto cleanup_index;
return error("Unable to get pack index %s\n%s", url,
curl_errorstr);
} }
} else { } else {
free(url); ret = error("Unable to start request");
fclose(indexfile); goto cleanup_index;
slot->local = NULL;
return error("Unable to start request");
} }
free(url); ret = move_temp_to_file(tmpfile, filename);
cleanup_index:
fclose(indexfile); fclose(indexfile);
slot->local = NULL; slot->local = NULL;
cleanup_pack:
return move_temp_to_file(tmpfile, filename); free(url);
free(hex);
return ret;
} }
static int setup_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1) static int setup_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1)