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)
|
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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user