Re: git bugs

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Ben Lynn <benlynn@...>
Cc: <git@...>
Subject: Re: git bugs
Date: Tuesday, June 10, 2008 - 1:44 pm

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