From: Junio C Hamano Date: Wed, 21 Dec 2005 19:58:30 GMT Subject: Re: Am I doing something wrong? Message-ID: <7vvexi8bo9.fsf@assigned-by-dhcp.cox.net> In-Reply-To: <7vhd92b90w.fsf@assigned-by-dhcp.cox.net> It turns out to be a stupid off-by-one error in http-fetch.c. The objects/info/packs file has the following: $ cat objects/info/packs P pack-46ff81b11ed16ed38caa4aada913cb08c00185b2.pack P pack-05f611b3b8198b262acdf678584d365f8e879aec.pack P pack-740c99c0be6734adbd130737dec2608dc4682761.pack $ The code that parses this in http-fetch had an off-by-one, and incorrectly thought that the last entry was incomplete. This problem did not surface earlier, because objects/info/packs file used to have other information after all the P lines, but http-fetch was not interested in was skipping them. The latest update-server-info stopped producing those extra lines. As a band-aid, I just ran this command at the server that public ones mirror from: $ echo >>objects/info/packs The change seems to have mirrored out already, and my "broken" client before the attached patch successfully fetches from there, so hopefully things would work OK for you as well. I also have to add some code to server-info.c, to append an empty after objects/info/packs file to work around this bug in the deployed http clients. Thanks for your help in diagnosing and fixing this problem. -- >8 -- [PATCH] http-fetch.c: fix objects/info/pack parsing. It failed to register the last pack mentioned in the objects/info/packs file. Also it had an independent overrun error. Signed-off-by: Junio C Hamano --- git diff diff --git a/http-fetch.c b/http-fetch.c index ad59f1c..3cd6ef9 100644 --- a/http-fetch.c +++ b/http-fetch.c @@ -658,7 +658,7 @@ static int fetch_indices(struct alt_base switch (data[i]) { case 'P': i++; - if (i + 52 < buffer.posn && + if (i + 52 <= buffer.posn && !strncmp(data + i, " pack-", 6) && !strncmp(data + i + 46, ".pack\n", 6)) { get_sha1_hex(data + i + 6, sha1); @@ -667,7 +667,7 @@ static int fetch_indices(struct alt_base break; } default: - while (data[i] != '\n') + while (i < buffer.posn && data[i] != '\n') i++; } i++; Compilation finished at Wed Dec 21 11:40:06