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:
parent
48188c259a
commit
20cfb3aa71
47
http-push.c
47
http-push.c
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user