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

[PATCH 5/6] exclude: do not respect symlinks for in-tree .gitignore

From
Jeff King <peff@peff.net>
Date
Feb 16, 2021, 14:44 UTC
Message-ID
<YCvaUukNiliIXHgq@coredump.intra.peff.net>
In-Reply-To
<YCvaJg8o882IqNnx@coredump.intra.peff.net>

As with .gitattributes, we would like to make sure that .gitignore files are handled consistently whether read from the index or from the filesystem. Likewise, we would like to avoid reading out-of-tree files pointed to by the symlinks, which could have security implications in certain setups.

We can cover both by using open_nofollow() when opening the in-tree files. We'll continue to follow links for core.excludesFile, as well as $GIT_DIR/info/exclude.

Signed-off-by: Jeff King <peff@peff.net>
---
 dir.c              | 12 ++++++++++--
 t/t0008-ignores.sh | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/dir.c b/dir.c
index f7fb1db718..3692a28186 100644
--- a/dir.c
+++ b/dir.c
@@ -1035,6 +1035,9 @@ static int add_patterns_from_buffer(char *buf, size_t size,
 				    const char *base, int baselen,
 				    struct pattern_list *pl);
 
+/* Flags for add_patterns() */
+#define PATTERN_NOFOLLOW (1<<0)
+
 /*
  * Given a file with name "fname", read it (either from disk, or from
  * an index if 'istate' is non-null), parse it and store the
@@ -1054,7 +1057,11 @@ static int add_patterns(const char *fname, const char *base, int baselen,
 	size_t size = 0;
 	char *buf;
 
-	fd = open(fname, O_RDONLY);
+	if (flags & PATTERN_NOFOLLOW)
+		fd = open_nofollow(fname, O_RDONLY);
+	else
+		fd = open(fname, O_RDONLY);
+
 	if (fd < 0 || fstat(fd, &st) < 0) {
 		if (fd < 0)
 			warn_on_fopen_errors(fname);
@@ -1558,7 +1565,8 @@ static void prep_exclude(struct dir_struct *dir,
 			strbuf_addbuf(&sb, &dir->basebuf);
 			strbuf_addstr(&sb, dir->exclude_per_dir);
 			pl->src = strbuf_detach(&sb, NULL);
-			add_patterns(pl->src, pl->src, stk->baselen, pl, istate, 0,
+			add_patterns(pl->src, pl->src, stk->baselen, pl, istate,
+				     PATTERN_NOFOLLOW,
 				     untracked ? &oid_stat : NULL);
 		}
 		/*
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index 370a389e5c..854cfda11f 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -865,4 +865,38 @@ test_expect_success 'info/exclude trumps core.excludesfile' '
 	test_cmp expect actual
 '
 
+test_expect_success SYMLINKS 'set up ignore file for symlink tests' '
+	echo "*" >ignore &&
+	rm -f .gitignore .git/info/exclude
+'
+
+test_expect_success SYMLINKS 'symlinks respected in core.excludesFile' '
+	test_when_finished "rm symlink" &&
+	ln -s ignore symlink &&
+	test_config core.excludesFile "$(pwd)/symlink" &&
+	echo file >expect &&
+	git check-ignore file >actual 2>err &&
+	test_cmp expect actual &&
+	test_must_be_empty err
+'
+
+test_expect_success SYMLINKS 'symlinks respected in info/exclude' '
+	test_when_finished "rm .git/info/exclude" &&
+	ln -s ../../ignore .git/info/exclude &&
+	echo file >expect &&
+	git check-ignore file >actual 2>err &&
+	test_cmp expect actual &&
+	test_must_be_empty err
+'
+
+test_expect_success SYMLINKS 'symlinks not respected in-tree' '
+	test_when_finished "rm .gitignore" &&
+	ln -s ignore .gitignore &&
+	mkdir subdir &&
+	ln -s ignore subdir/.gitignore &&
+	test_must_fail git check-ignore subdir/file >actual 2>err &&
+	test_must_be_empty actual &&
+	test_i18ngrep "unable to access.*gitignore" err
+'
+
 test_done
-- 
2.30.1.986.gd86016a168
Previous: Jeff KingNext: Jeff King
Message 19 of 25 in “Limited local file inclusion with .mailmap symlinks and git-archive”
  1. Blake BurkhartFeb 13, 2021
  2. Jeff KingFeb 15, 2021
  3. 1/2 fsck: make symlinked .gitignore and .gitattributes a warningJeff King, Feb 15, 2021
  4. Ævar Arnfjörð BjarmasonFeb 16, 2021
  5. Jeff KingFeb 16, 2021
  6. Junio C HamanoFeb 16, 2021
  7. Jeff KingFeb 16, 2021
  8. Jeff KingFeb 16, 2021
  9. 0/6 open in-tree files with O_NOFOLLOWJeff King, Feb 16, 2021
  10. 1/6 add open_nofollow() helperJeff King, Feb 16, 2021
  11. Jeff KingFeb 16, 2021
  12. Taylor BlauFeb 16, 2021
  13. Jeff KingFeb 16, 2021
  14. Taylor BlauFeb 16, 2021
  15. Taylor BlauFeb 16, 2021
  16. Jeff KingFeb 16, 2021
  17. 2/6 attr: convert "macro_ok" into a flags fieldJeff King, Feb 16, 2021
  18. 4/6 attr: do not respect symlinks for in-tree .gitattributesJeff King, Feb 16, 2021
  19. 5/6 exclude: do not respect symlinks for in-tree .gitignoreJeff King, Feb 16, 2021
  20. 3/6 exclude: add flags parameter to add_patterns()Jeff King, Feb 16, 2021
  21. 6/6 mailmap: do not respect symlinks for in-tree .mailmapJeff King, Feb 16, 2021
  22. Jeff KingFeb 16, 2021
  23. Junio C HamanoFeb 25, 2021
  24. Jeff KingFeb 26, 2021
  25. 2/2 disallow symlinked .mailmap filesJeff King, Feb 15, 2021

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.