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

[PATCH] fixup! propagate errno from failing read

From
Han-Wen Nienhuys via GitGitGadget <gitgitgadget@gmail.com>
Date
Aug 17, 2021, 12:31 UTC
Message-ID
<pull.1068.git.git.1629203489546.gitgitgadget@gmail.com>
From: Han-Wen Nienhuys <hanwen@google.com>
This fixes a crash triggered by the BUG() statement.

This can occur with symlinked .git/refs. To check availability, refs_verify_refname_available will run refs_read_raw_ref() on each prefix, leading to a read() from .git/refs (which is a directory).

When handling the symlink case, it is probably more robust to re-issue the lstat() as a normal stat(), in which case, we would fall back to the directory case.

For now, propagating errno from strbuf_read() is simpler and avoids the crash.
Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
---
    fixup! propagate errno from failing read
    
    This fixes a crash triggered by the BUG() statement.
    
    This can occur with symlinked .git/refs. To check availability,
    refs_verify_refname_available will run refs_read_raw_ref() on each
    prefix, leading to a read() from .git/refs (which is a directory).
    
    When handling the symlink case, it is probably more robust to re-issue
    the lstat() as a normal stat(), in which case, we would fall back to the
    directory case.
    
    For now, propagating errno from strbuf_read() is simpler and avoids the
    crash.
    
    Signed-off-by: Han-Wen Nienhuys hanwen@google.com
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1068%2Fhanwen%2Ffiles-fixup-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1068/hanwen/files-fixup-v1
Pull-Request: https://github.com/git/git/pull/1068
 refs/files-backend.c |  1 +
 t/t3200-branch.sh    | 14 ++++++++++++++
 2 files changed, 15 insertions(+)
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 0d96eeba61b..f546cc3cc3d 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -454,6 +454,7 @@ stat_ref:
 	}
 	strbuf_reset(&sb_contents);
 	if (strbuf_read(&sb_contents, fd, 256) < 0) {
+		myerr = errno;
 		close(fd);
 		goto out;
 	}
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index cc4b10236e2..dd17718160a 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -109,6 +109,20 @@ test_expect_success 'git branch -m n/n n should work' '
 	git reflog exists refs/heads/n
 '
 
+test_expect_success 'git branch -m with symlinked .git/refs' '
+	git init subdir &&
+	test_when_finished "rm -rf subdir" &&
+	(cd subdir &&
+		for d in refs objects packed-refs ; do
+		rm -rf .git/$d &&
+		ln -s ../../.git/$d .git/$d ; done ) &&
+	git --git-dir subdir/.git/ branch rename-src &&
+	expect=$(git rev-parse rename-src) &&
+	git --git-dir subdir/.git/ branch -m rename-src rename-dest &&
+	test $(git rev-parse rename-dest) = "$expect" &&
+	git branch -D rename-dest
+'
+
 # The topmost entry in reflog for branch bbb is about branch creation.
 # Hence, we compare bbb@{1} (instead of bbb@{0}) with aaa@{0}.
 

base-commit: f000ecbed922c727382651490e75014f003c89ca
-- 
gitgitgadget
Next: Jonathan Tan
Message 1 of 14 in “fixup! propagate errno from failing read”
  1. fixup! propagate errno from failing readHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  2. Jonathan TanAug 17, 2021
  3. Jonathan NiederAug 18, 2021
  4. Junio C HamanoAug 17, 2021
  5. Han-Wen NienhuysAug 18, 2021
  6. Junio C HamanoAug 18, 2021
  7. Junio C HamanoAug 19, 2021
  8. Han-Wen NienhuysAug 19, 2021
  9. Jeff KingAug 19, 2021
  10. t3200: refactor symlink testCarlo Marcelo Arenas Belón, Aug 19, 2021
  11. Eric SunshineAug 19, 2021
  12. t3200: refactor symlink test from hn/refs-errno-cleanupCarlo Marcelo Arenas Belón, Aug 19, 2021
  13. Junio C HamanoAug 19, 2021
  14. Junio C HamanoAug 19, 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.