git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] fetch-pack: check for valid commit from server

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Aug 19, 2011, 15:11 UTC
Message-ID
<1313766693-20798-1-git-send-email-pclouds@gmail.com>
In-Reply-To
<1313674563-12755-1-git-send-email-pclouds@gmail.com>

A malicious server can return ACK with non-existent SHA-1 or not a commit. lookup_commit() in this case may return NULL. Do not let fetch-pack crash by accessing NULL address in this case.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 2011/8/19 Shawn Pearce <spearce@spearce.org>:
 > 2011/8/18 Nguyễn Thái Ngọc Duy <pclouds@gmail.com>:
 >>  However it raises another question, what if the other end returns a
 >>  valid commit, but not the one in "have" line fetch-pack sent? Are we
 >>  OK with that?
 >
 > Not really. The server is not supposed to return a SHA-1 in the ACK
 > line unless the client said it first in a have line. So aborting with
 > an error is reasonable thing for a client to do.
 I assumed I could check result_sha1 against sha1. If it did not match,
 fetch-pack would abort. But I was wrong because fetch-pack would send
 a few have lines before receiving the first ack (which carries sha1
 of some 'have' line in the middle, not the last 'have'). I'd leave it
 here if anyone wants to tackle it.
 builtin/fetch-pack.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index 4367984..561f1a3 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -395,6 +395,9 @@ static int find_common(int fd[2], unsigned char *result_sha1,
 				case ACK_continue: {
 					struct commit *commit =
 						lookup_commit(result_sha1);
+					if (!commit)
+						die("server ACK contained unknown commit %s",
+						    sha1_to_hex(result_sha1));
 					if (args.stateless_rpc
 					 && ack == ACK_common
 					 && !(commit->object.flags & COMMON)) {
-- 
1.7.4.74.g639db
Previous: Nguyen Thai Ngoc DuyNext: Junio C Hamano
Message 4 of 5 in “fetch-pack: check for valid commit from server”
  1. fetch-pack: check for valid commit from serverNguyễn Thái Ngọc Duy, Aug 18, 2011
  2. Shawn PearceAug 18, 2011
  3. Nguyen Thai Ngoc DuyAug 19, 2011
  4. fetch-pack: check for valid commit from serverNguyễn Thái Ngọc Duy, Aug 19, 2011
  5. Junio C HamanoAug 19, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.