[PATCH] fixup! propagate errno from failing read
From: Han-Wen Nienhuys via GitGitGadget <hidden>
Date: 2021-08-17 12:31:36
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Han-Wen Nienhuys <redacted>
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 <redacted>
---
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