Don't die in git-http-fetch when fetching packs.
My sp/mmap changes to pack-check.c modified the function such that it expects packed_git.pack_size to be populated with the total bytecount of the packfile by the caller. But that isn't the case for packs obtained by git-http-fetch as pack_size was not initialized before being accessed. This caused verify_pack to think it had 2^32-21 bytes available when the downloaded pack perhaps was only 305 bytes in length. The use_pack function then later dies with "offset beyond end of packfile" when computing the overall file checksum. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
cec21ca7cf
commit
1c23d794bf
@ -809,6 +809,7 @@ static int fetch_pack(struct alt_base *repo, unsigned char *sha1)
|
|||||||
return error("Unable to start request");
|
return error("Unable to start request");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
target->pack_size = ftell(packfile);
|
||||||
fclose(packfile);
|
fclose(packfile);
|
||||||
|
|
||||||
ret = move_temp_to_file(tmpfile, filename);
|
ret = move_temp_to_file(tmpfile, filename);
|
||||||
|
@ -770,11 +770,14 @@ static void finish_request(struct transfer_request *request)
|
|||||||
request->url, curl_errorstr);
|
request->url, curl_errorstr);
|
||||||
remote->can_update_info_refs = 0;
|
remote->can_update_info_refs = 0;
|
||||||
} else {
|
} else {
|
||||||
|
off_t pack_size = ftell(request->local_stream);
|
||||||
|
|
||||||
fclose(request->local_stream);
|
fclose(request->local_stream);
|
||||||
request->local_stream = NULL;
|
request->local_stream = NULL;
|
||||||
if (!move_temp_to_file(request->tmpfile,
|
if (!move_temp_to_file(request->tmpfile,
|
||||||
request->filename)) {
|
request->filename)) {
|
||||||
target = (struct packed_git *)request->userData;
|
target = (struct packed_git *)request->userData;
|
||||||
|
target->pack_size = pack_size;
|
||||||
lst = &remote->packs;
|
lst = &remote->packs;
|
||||||
while (*lst != target)
|
while (*lst != target)
|
||||||
lst = &((*lst)->next);
|
lst = &((*lst)->next);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user