Re: git bugs

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linus Torvalds
Subject: Re: git bugs
Date: Tuesday, June 10, 2008 - 10:44 am

On Tue, 10 Jun 2008, Ben Lynn wrote:

Heh.

That's just because our "smudge_racily_clean_entry()" uses 0 as the magic 
smudging size.

You can fix this multiple ways. One would be to pick another size that is 
simply less likely (eg ~0 instead), which leaves the theoretical race, and 
just makes it practically impossible to hit (not that I think it's very 
practical to hit already).

The other approach is to know that an empty blob always has a very 
specific SHA1. Here's an trial patch.

		Linus

---
 read-cache.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/read-cache.c b/read-cache.c
index 8e5fbb6..f83de8c 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -138,6 +138,16 @@ static int ce_modified_check_fs(struct cache_entry *ce, struct stat *st)
 	return 0;
 }
 
+static int is_empty_blob_sha1(const unsigned char *sha1)
+{
+	static const unsigned char empty_blob_sha1[20] = {
+		0xe6,0x9d,0xe2,0x9b,0xb2,0xd1,0xd6,0x43,0x4b,0x8b,
+		0x29,0xae,0x77,0x5a,0xd8,0xc2,0xe4,0x8c,0x53,0x91
+	};
+
+	return !hashcmp(sha1, empty_blob_sha1);
+}
+
 static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
 {
 	unsigned int changed = 0;
@@ -193,6 +203,12 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
 	if (ce->ce_size != (unsigned int) st->st_size)
 		changed |= DATA_CHANGED;
 
+	/* Racily smudged entry? */
+	if (!ce->ce_size) {
+		if (!is_empty_blob_sha1(ce->sha1))
+			changed |= DATA_CHANGED;
+	}
+
 	return changed;
 }
 
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
git bugs, Ben Lynn, (Tue Jun 10, 1:41 am)
Re: git bugs, Daniel Barkalow, (Tue Jun 10, 9:58 am)
Re: git bugs, Linus Torvalds, (Tue Jun 10, 10:44 am)
Re: git bugs, Ben Lynn, (Tue Jun 10, 11:45 am)
Re: git bugs, Linus Torvalds, (Tue Jun 10, 1:06 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 4:09 pm)
Re: git bugs, Junio C Hamano, (Tue Jun 10, 4:38 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 5:02 pm)
Re: git bugs, Junio C Hamano, (Tue Jun 10, 5:20 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 5:24 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 5:53 pm)
Re: git bugs, Linus Torvalds, (Tue Jun 10, 6:36 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 7:04 pm)
Re: git bugs, Linus Torvalds, (Tue Jun 10, 7:12 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 7:31 pm)
Re: git bugs, Linus Torvalds, (Tue Jun 10, 7:39 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 10:58 pm)
Re: git bugs, Ben Lynn, (Tue Jun 10, 11:18 pm)
Re: git bugs, Stephen R. van den Berg, (Wed Jun 11, 5:46 am)
Re: git bugs, Linus Torvalds, (Wed Jun 11, 7:52 am)
Re: git bugs, Linus Torvalds, (Wed Jun 11, 7:54 am)
Re: git bugs, Ben Lynn, (Wed Jun 11, 10:52 am)
Re: git bugs, Linus Torvalds, (Wed Jun 11, 11:10 am)
Re: git bugs, Ben Lynn, (Wed Jun 11, 11:48 am)
Re: git bugs, Linus Torvalds, (Wed Jun 11, 11:53 am)
Re: git bugs, Ben Lynn, (Wed Jun 11, 1:57 pm)
Re: git bugs, Junio C Hamano, (Wed Jun 11, 2:50 pm)
Re: git bugs, Shawn O. Pearce, (Wed Jun 11, 8:17 pm)
Re: git bugs, Ben Lynn, (Wed Jun 11, 11:46 pm)
Re: git bugs, Ben Lynn, (Wed Jun 11, 11:51 pm)
Re: git bugs, Johannes Schindelin, (Thu Jun 12, 12:12 am)
Re: git bugs, Junio C Hamano, (Thu Jun 12, 1:06 pm)
Re: git bugs, Jeff King, (Fri Jun 13, 3:10 am)
Re: git bugs, Junio C Hamano, (Fri Jun 13, 4:09 pm)
Re: git bugs, Jeff King, (Fri Jun 13, 11:25 pm)