git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Shawn O. Pearce" <spearce@spearce.org>
To: Junio C Hamano <gitster@pobox.com>, Tay Ray Chuan <rctay89@gmail.com>
Cc: git@vger.kernel.org, Johannes Sixt <j6t@kdbg.org>,
	Ilari Liusvaara <ilari.liusvaara@elisanet.fi>,
	Michael J Gruber <git@drmicha.warpmail.net>,
	Christian Halstrick <christian.halstrick@gmail.com>,
	jan.sievers@sap.com, Matthias Sohn <matthias.sohn@sap.com>,
	Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v4 11/11] http-fetch: Use temporary files for pack-*.idx until verified
Date: Mon, 19 Apr 2010 07:23:10 -0700	[thread overview]
Message-ID: <1271686990-16363-7-git-send-email-spearce@spearce.org> (raw)
In-Reply-To: <20100418115744.0000238b@unknown>

Verify that a downloaded pack-*.idx file is consistent and valid
as an index file before we rename it into its final destination.
This prevents a corrupt index file from later being treated as a
usable file, confusing readers.

Check that we do not have the pack index file before invoking
fetch_pack_index(); that way, we can do without the has_pack_index()
check in fetch_pack_index().

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---

 Added paragraph describing the move of has_pack_index() to the
 commit message.
 
 No code change from v3.

 http.c                |   56 ++++++++++++++++++++++++++++++++++--------------
 t/t5550-http-fetch.sh |   15 +++++++++++++
 2 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/http.c b/http.c
index 2ebd679..0813c9e 100644
--- a/http.c
+++ b/http.c
@@ -897,18 +897,11 @@ int http_fetch_ref(const char *base, struct ref *ref)
 }
 
 /* Helpers for fetching packs */
-static int fetch_pack_index(unsigned char *sha1, const char *base_url)
+static char *fetch_pack_index(unsigned char *sha1, const char *base_url)
 {
-	int ret = 0;
-	char *filename;
-	char *url = NULL;
+	char *url, *tmp;
 	struct strbuf buf = STRBUF_INIT;
 
-	if (has_pack_index(sha1)) {
-		ret = 0;
-		goto cleanup;
-	}
-
 	if (http_is_verbose)
 		fprintf(stderr, "Getting index for pack %s\n", sha1_to_hex(sha1));
 
@@ -916,26 +909,55 @@ static int fetch_pack_index(unsigned char *sha1, const char *base_url)
 	strbuf_addf(&buf, "objects/pack/pack-%s.idx", sha1_to_hex(sha1));
 	url = strbuf_detach(&buf, NULL);
 
-	filename = sha1_pack_index_name(sha1);
-	if (http_get_file(url, filename, 0) != HTTP_OK)
-		ret = error("Unable to get pack index %s\n", url);
+	strbuf_addf(&buf, "%s.temp", sha1_pack_index_name(sha1));
+	tmp = strbuf_detach(&buf, NULL);
+
+	if (http_get_file(url, tmp, 0) != HTTP_OK) {
+		error("Unable to get pack index %s\n", url);
+		free(tmp);
+		tmp = NULL;
+	}
 
-cleanup:
 	free(url);
-	return ret;
+	return tmp;
 }
 
 static int fetch_and_setup_pack_index(struct packed_git **packs_head,
 	unsigned char *sha1, const char *base_url)
 {
 	struct packed_git *new_pack;
+	char *tmp_idx = NULL;
+	int ret;
+
+	if (has_pack_index(sha1)) {
+		new_pack = parse_pack_index(sha1, NULL);
+		if (!new_pack)
+			return -1; /* parse_pack_index() already issued error message */
+		goto add_pack;
+	}
 
-	if (fetch_pack_index(sha1, base_url))
+	tmp_idx = fetch_pack_index(sha1, base_url);
+	if (!tmp_idx)
 		return -1;
 
-	new_pack = parse_pack_index(sha1, sha1_pack_index_name(sha1));
-	if (!new_pack)
+	new_pack = parse_pack_index(sha1, tmp_idx);
+	if (!new_pack) {
+		unlink(tmp_idx);
+		free(tmp_idx);
+
 		return -1; /* parse_pack_index() already issued error message */
+	}
+
+	ret = verify_pack_index(new_pack);
+	if (!ret) {
+		close_pack_index(new_pack);
+		ret = move_temp_to_file(tmp_idx, sha1_pack_index_name(sha1));
+	}
+	free(tmp_idx);
+	if (ret)
+		return -1;
+
+add_pack:
 	new_pack->next = *packs_head;
 	*packs_head = new_pack;
 	return 0;
diff --git a/t/t5550-http-fetch.sh b/t/t5550-http-fetch.sh
index 1a4dfc9..fc675b5 100755
--- a/t/t5550-http-fetch.sh
+++ b/t/t5550-http-fetch.sh
@@ -77,6 +77,21 @@ test_expect_success 'fetch notices corrupt pack' '
 	)
 '
 
+test_expect_success 'fetch notices corrupt idx' '
+	cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&
+	(cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&
+	 p=`ls objects/pack/pack-*.idx` &&
+	 chmod u+w $p &&
+	 printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc
+	) &&
+	mkdir repo_bad2.git &&
+	(cd repo_bad2.git &&
+	 git --bare init &&
+	 test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad2.git &&
+	 test 0 = `ls objects/pack | wc -l`
+	)
+'
+
 test_expect_success 'did not use upload-pack service' '
 	grep '/git-upload-pack' <"$HTTPD_ROOT_PATH"/access.log >act
 	: >exp
-- 
1.7.1.rc1.279.g22727

  parent reply	other threads:[~2010-04-19 14:24 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-15  9:51 git fetch over http:// left my repo broken Christian Halstrick
2010-04-15  9:58 ` Michael J Gruber
2010-04-15 11:43   ` Ilari Liusvaara
2010-04-15 14:15     ` Shawn O. Pearce
2010-04-15 19:09       ` [PATCH 0/6] detect dumb HTTP pack file corruption Shawn O. Pearce
2010-04-17 17:56         ` Junio C Hamano
2010-04-17 19:11           ` Shawn O. Pearce
2010-04-15 19:09       ` [PATCH 1/6] http.c: Remove bad free of static block Shawn O. Pearce
2010-04-15 19:09       ` [PATCH 2/6] t5550-http-fetch: Use subshell for repository operations Shawn O. Pearce
2010-04-15 19:09       ` [PATCH 3/6] http.c: Tiny refactoring of finish_http_pack_request Shawn O. Pearce
2010-04-15 19:09       ` [PATCH 4/6] http.c: Drop useless != NULL test in finish_http_pack_request Shawn O. Pearce
2010-04-15 19:09       ` [PATCH 5/6] http-fetch: Use index-pack rather than verify-pack to check packs Shawn O. Pearce
2010-04-15 19:34         ` Johannes Sixt
2010-04-15 21:25           ` [PATCH v2 " Shawn O. Pearce
2010-04-16  2:55             ` Tay Ray Chuan
2010-04-17 19:30               ` Shawn O. Pearce
2010-04-15 21:25           ` [PATCH v2 6/6] http-fetch: Use temporary files for pack-*.idx until verified Shawn O. Pearce
2010-04-16  2:03             ` Tay Ray Chuan
2010-04-17 20:07               ` [PATCH v3 01/11] http.c: Remove bad free of static block Shawn O. Pearce
2010-04-17 20:07               ` [PATCH v3 02/11] t5550-http-fetch: Use subshell for repository operations Shawn O. Pearce
2010-04-17 20:07               ` [PATCH v3 03/11] http.c: Tiny refactoring of finish_http_pack_request Shawn O. Pearce
2010-04-17 20:07               ` [PATCH v3 04/11] http.c: Drop useless != NULL test in finish_http_pack_request Shawn O. Pearce
2010-04-17 20:07               ` [PATCH v3 05/11] http.c: Don't store destination name in request structures Shawn O. Pearce
2010-04-18  3:36                 ` Tay Ray Chuan
2010-04-17 20:07               ` [PATCH v3 06/11] http.c: Remove unnecessary strdup of sha1_to_hex result Shawn O. Pearce
2010-04-18  3:14                 ` Tay Ray Chuan
2010-04-17 20:07               ` [PATCH v3 07/11] Introduce close_pack_index to permit replacement Shawn O. Pearce
2010-04-17 20:07               ` [PATCH v3 08/11] Extract verify_pack_index for reuse from verify_pack Shawn O. Pearce
2010-04-17 20:07               ` [PATCH v3 09/11] Allow parse_pack_index on temporary files Shawn O. Pearce
2010-04-17 20:07               ` [PATCH v3 10/11] http-fetch: Use index-pack rather than verify-pack to check packs Shawn O. Pearce
2010-04-18  3:07                 ` Tay Ray Chuan
2010-04-17 20:07               ` [PATCH v3 11/11] http-fetch: Use temporary files for pack-*.idx until verified Shawn O. Pearce
2010-04-18  3:57                 ` Tay Ray Chuan
2010-04-19 14:23                   ` [PATCH v4 00/11] Resend sp/maint-dumb-http-pack-reidx Shawn O. Pearce
2010-04-19 14:46                     ` Tay Ray Chuan
2010-04-19 14:49                       ` Shawn O. Pearce
2010-04-20  4:33                         ` Tay Ray Chuan
2010-04-19 14:23                   ` [PATCH v4 06/11] http.c: Remove unnecessary strdup of sha1_to_hex result Shawn O. Pearce
2010-04-19 14:23                   ` [PATCH v4 07/11] Introduce close_pack_index to permit replacement Shawn O. Pearce
2010-04-19 14:23                   ` [PATCH v4 08/11] Extract verify_pack_index for reuse from verify_pack Shawn O. Pearce
2010-04-19 14:23                   ` [PATCH v4 09/11] Allow parse_pack_index on temporary files Shawn O. Pearce
2010-04-19 14:23                   ` [PATCH v4 10/11] http-fetch: Use index-pack rather than verify-pack to check packs Shawn O. Pearce
2010-04-19 14:35                     ` Tay Ray Chuan
2010-04-19 14:23                   ` Shawn O. Pearce [this message]
2010-04-15 19:09       ` [PATCH 6/6] http-fetch: Use temporary files for pack-*.idx until verified Shawn O. Pearce
2010-04-15 11:33 ` git fetch over http:// left my repo broken Ilari Liusvaara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1271686990-16363-7-git-send-email-spearce@spearce.org \
    --to=spearce@spearce.org \
    --cc=christian.halstrick@gmail.com \
    --cc=git@drmicha.warpmail.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=ilari.liusvaara@elisanet.fi \
    --cc=j6t@kdbg.org \
    --cc=jan.sievers@sap.com \
    --cc=matthias.sohn@sap.com \
    --cc=rctay89@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).