1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-18 20:36:15 +02:00

refs: propagate errno when reading special refs fails

Some refs in Git are more special than others due to reasons explained
in the next commit. These refs are read via `refs_read_special_head()`,
but this function doesn't behave the same as when we try to read a
normal ref. Most importantly, we do not propagate `failure_errno` in the
case where the reference does not exist, which is behaviour that we rely
on in many parts of Git.

Fix this bug by propagating errno when `strbuf_read_file()` fails.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2023-12-14 14:37:02 +01:00 committed by Junio C Hamano
parent 8f61321ccb
commit 668cdc043f
2 changed files with 13 additions and 1 deletions

4
refs.c
View File

@ -1806,8 +1806,10 @@ static int refs_read_special_head(struct ref_store *ref_store,
int result = -1;
strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
if (strbuf_read_file(&content, full_path.buf, 0) < 0)
if (strbuf_read_file(&content, full_path.buf, 0) < 0) {
*failure_errno = errno;
goto done;
}
result = parse_loose_ref_contents(content.buf, oid, referent, type,
failure_errno);

View File

@ -266,4 +266,14 @@ test_expect_success '--exists with directory fails with generic error' '
test_cmp expect err
'
test_expect_success '--exists with non-existent special ref' '
test_expect_code 2 git show-ref --exists FETCH_HEAD
'
test_expect_success '--exists with existing special ref' '
test_when_finished "rm .git/FETCH_HEAD" &&
git rev-parse HEAD >.git/FETCH_HEAD &&
git show-ref --exists FETCH_HEAD
'
test_done