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

Re* [PATCH 2/2] check-ignore.c: fix segfault with '.' argument from repo root

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 19, 2013, 19:56 UTC
Message-ID
<7v1ucc5b7n.fsf_-_@alter.siamese.dyndns.org>
In-Reply-To
<CAOkDyE9VVuFn6B=Fe4XHxGCEW0MFgndx1X0+9hO36Soxb37YQw@mail.gmail.com>
Adam Spiers <git@adamspiers.org> writes:
Show 6 quoted lines
> Fair enough.  I'll reply to this with a new version.[0]
>
> [0] I wish there was a clean way to include the new version inline,
>     but as I've noted before, there doesn't seem to be:
>
>     http://article.gmane.org/gmane.comp.version-control.git/146110

I find it easier to later find the patch if you made it a separate follow-up like you did, but you can do it this way if you really want to, using a scissors line, like so. Please do not try to be creative and change the shape of scissors just for the sake of chaning it.

-- >8 --
Subject: name-hash: allow hashing an empty string

Usually we do not pass an empty string to the function hash_name() because we almost always ask for hash values for a path that is a candidate to be added to the index. However, check-ignore (and most likely check-attr, but I didn't check) apparently has a callchain to ask the hash value for an empty path when it was given a "." from the top-level directory to ask "Is the path . excluded by default?"

Make sure that hash_name() does not overrun the end of the given pathname even when it is empty.

Also remove a sweep-the-issue-under-the-rug conditional in check-ignore that avoided to pass an empty string to the callchain.

Signed-off-by: Adam Spiers <git@adamspiers.org>
---
 builtin/check-ignore.c | 2 +-
 name-hash.c            | 4 ++--
 t/t0008-ignores.sh     | 5 +++++
 3 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c
index 709535c..0240f99 100644
--- a/builtin/check-ignore.c
+++ b/builtin/check-ignore.c
@@ -89,7 +89,7 @@ static int check_ignore(const char *prefix, const char **pathspec)
 					? strlen(prefix) : 0, path);
 		full_path = check_path_for_gitlink(full_path);
 		die_if_path_beyond_symlink(full_path, prefix);
-		if (!seen[i] && path[0]) {
+		if (!seen[i]) {
 			exclude = last_exclude_matching_path(&check, full_path,
 							     -1, &dtype);
 			if (exclude) {
diff --git a/name-hash.c b/name-hash.c
index d8d25c2..942c459 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -24,11 +24,11 @@ static unsigned int hash_name(const char *name, int namelen)
 {
 	unsigned int hash = 0x123;
 
-	do {
+	while (namelen--) {
 		unsigned char c = *name++;
 		c = icase_hash(c);
 		hash = hash*101 + c;
-	} while (--namelen);
+	}
 	return hash;
 }
 
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index ebe7c70..9c1bde1 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -138,6 +138,7 @@ test_expect_success 'setup' '
 	cat <<-\EOF >.gitignore &&
 		one
 		ignored-*
+		top-level-dir/
 	EOF
 	for dir in . a
 	do
@@ -177,6 +178,10 @@ test_expect_success 'setup' '
 #
 # test invalid inputs
 
+test_expect_success_multi '. corner-case' '' '
+	test_check_ignore . 1
+'
+
 test_expect_success_multi 'empty command line' '' '
 	test_check_ignore "" 128 &&
 	stderr_contains "fatal: no path specified"
Previous: Adam SpiersNext: Adam Spiers
Message 14 of 27 in “[BUG] git-check-ignore: Segmentation fault”
  1. Zoltan KlingerFeb 19, 2013
  2. Adam SpiersFeb 19, 2013
  3. 1/2 t0008: document test_expect_success_multiAdam Spiers, Feb 19, 2013
  4. 2/2 check-ignore.c: fix segfault with '.' argument from repo rootAdam Spiers, Feb 19, 2013
  5. Junio C HamanoFeb 19, 2013
  6. Adam SpiersFeb 19, 2013
  7. 2/2 check-ignore.c, dir.c: fix segfault with '.' argument from repo rootAdam Spiers, Feb 19, 2013
  8. Junio C HamanoFeb 19, 2013
  9. Junio C HamanoFeb 19, 2013
  10. Adam SpiersFeb 20, 2013
  11. Junio C HamanoFeb 20, 2013
  12. Adam SpiersFeb 20, 2013
  13. Adam SpiersFeb 20, 2013
  14. Re* [PATCH 2/2] check-ignore.c: fix segfault with '.' argument from repo rootJunio C Hamano, Feb 19, 2013
  15. Adam SpiersFeb 20, 2013
  16. Junio C HamanoFeb 20, 2013
  17. Adam SpiersFeb 20, 2013
  18. Junio C HamanoFeb 21, 2013
  19. 1/2 format-patch: rename "no_inline" fieldJunio C Hamano, Feb 21, 2013
  20. 2/2 format-patch: --inline-singleJunio C Hamano, Feb 21, 2013
  21. Jeff KingFeb 21, 2013
  22. Junio C HamanoFeb 21, 2013
  23. Junio C HamanoFeb 21, 2013
  24. Adam SpiersFeb 22, 2013
  25. Junio C HamanoFeb 22, 2013
  26. Jeff KingFeb 22, 2013
  27. Junio C HamanoFeb 19, 2013

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.