From: Han-Wen Nienhuys <hanwen@xxxxxxxxxx> 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@xxxxxxxxxx> --- 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@xxxxxxxxxx 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