From: David Meybohm Date: Fri, 27 May 2005 02:59:10 +0000 (-0400) Subject: [PATCH] check_file_directory_conflict path fix X-Git-Tag: v0.99~438 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=8310c2c0b585d3ac35a275f795e15fd9887e8b7d;p=git.git [PATCH] check_file_directory_conflict path fix check_file_directory_conflict can give the wrong answers. This is because the wrong length is passed to cache_name_pos. The length passed should be the length of the whole path from the root, not the length of each path subcomponent. $ git-init-db defaulting to local storage area $ mkdir path && touch path/file $ git-update-cache --add path/file $ rm path/file $ mkdir path/file && touch path/file/f $ git-update-cache --add path/file/f <-- Conflict ignored $ Signed-off-by: David Meybohm Signed-off-by: Linus Torvalds --- diff --git a/read-cache.c b/read-cache.c index 34c040ad..bfdaee02 100644 --- a/read-cache.c +++ b/read-cache.c @@ -200,11 +200,13 @@ static int check_file_directory_conflict(const struct cache_entry *ce, cp = pathbuf; while (1) { char *ep = strchr(cp, '/'); + int len; if (!ep) break; *ep = 0; /* first cut it at slash */ + len = ep - pathbuf; pos = cache_name_pos(pathbuf, - htons(create_ce_flags(ep-cp, stage))); + htons(create_ce_flags(len, stage))); if (0 <= pos) { /* Our leading path component is registered as a file, * and we are trying to make it a directory. This is