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

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

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 19, 2013, 19:59 UTC
Message-ID
<7vzjz03wid.fsf@alter.siamese.dyndns.org>
In-Reply-To
<1361301696-11307-1-git-send-email-git@adamspiers.org>
Adam Spiers <git@adamspiers.org> writes:
> Fix a corner case where check-ignore would segfault when run with the
> '.' argument from the top level of a repository, due to prefix_path()
> converting '.' into the empty string.

The description does not match what I understand is happening from the original report, though. The above is more like this, no?

    When check-ignore is run with the '.' argument from the top level of
    a repository, it fed an empty string to hash_name() in name-hash.c
    and caused a segfault, as the function kept reading forever past the
    end of the string.

A point to note is that it is not cleaer why it is a corner case to ask about a pathspec ".". It is a valid question "Is the whole tree ignored by default?", isn't it?

> It doesn't make much sense to
> call check-ignore from the top level with '.' as a parameter, since
> the top-level directory would never typically be ignored,

And this sounds like a really bad excuse. If it were "it does not make *any* sense ... because the top level is *never* ignored", then the patch is a perfectly fine optimization that happens to work around the problem, but the use of "much" and "typically" is a sure sign that the design of the fix is iffy. It also shows that the patch is not a fix, but is sweeping the problem under the rug, if there were a valid use case to set the top level to be ignored.

I wonder what would happen if we removed that "&& path[0]" check from the caller, not add the "assume the top is never ignored" workaround, and do something like this to the location that causes segv, so that it can give an answer when asked to hash an empty string?

Does the callchain that goes down to this function have other places that assume they will never see an empty string, like this function does, which I _think_ is the real issue?

 name-hash.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
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;
 }
 
Previous: Adam SpiersNext: Junio C Hamano
Message 8 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.