[PATCH v5 5/6] refs: explicitly return failure_errno from parse_loose_ref_contents
From: Han-Wen Nienhuys via GitGitGadget <hidden>
Date: 2021-07-07 19:08:02
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Han-Wen Nienhuys <redacted> The EINVAL error from parse_loose_ref_contents is used in files-backend to create a custom error message. Signed-off-by: Han-Wen Nienhuys <redacted> Reviewed-by: Ævar Arnfjörð Bjarmason <redacted> --- refs.c | 8 +++++--- refs/files-backend.c | 14 ++++++++++---- refs/refs-internal.h | 6 ++++-- 3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/refs.c b/refs.c
index de3826f60c9..96df78a9509 100644
--- a/refs.c
+++ b/refs.c@@ -1653,7 +1653,8 @@ int for_each_fullref_in_prefixes(const char *namespace, static int refs_read_special_head(struct ref_store *ref_store, const char *refname, struct object_id *oid, - struct strbuf *referent, unsigned int *type) + struct strbuf *referent, unsigned int *type, + int *failure_errno) { struct strbuf full_path = STRBUF_INIT; struct strbuf content = STRBUF_INIT;
@@ -1663,7 +1664,8 @@ static int refs_read_special_head(struct ref_store *ref_store, if (strbuf_read_file(&content, full_path.buf, 0) < 0) goto done; - result = parse_loose_ref_contents(content.buf, oid, referent, type); + result = parse_loose_ref_contents(content.buf, oid, referent, type, + failure_errno); done: strbuf_release(&full_path);
@@ -1681,7 +1683,7 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, *failure_errno = 0; if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) { return refs_read_special_head(ref_store, refname, oid, referent, - type); + type, failure_errno); } return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
diff --git a/refs/files-backend.c b/refs/files-backend.c
index f38c9703504..7aafdf2ce3d 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c@@ -455,9 +455,14 @@ stat_ref: strbuf_rtrim(&sb_contents); buf = sb_contents.buf; - ret = parse_loose_ref_contents(buf, oid, referent, type); - + ret = parse_loose_ref_contents(buf, oid, referent, type, failure_errno); + errno = *failure_errno; out: + /* + * Many system calls in this function can fail with ENOTDIR/EISDIR, and + * we want to collect all of them, so simply copy the error out from + * errno. + */ *failure_errno = errno; strbuf_release(&sb_path); strbuf_release(&sb_contents);
@@ -465,7 +470,8 @@ out: } int parse_loose_ref_contents(const char *buf, struct object_id *oid, - struct strbuf *referent, unsigned int *type) + struct strbuf *referent, unsigned int *type, + int *failure_errno) { const char *p; if (skip_prefix(buf, "ref:", &buf)) {
@@ -484,7 +490,7 @@ int parse_loose_ref_contents(const char *buf, struct object_id *oid, if (parse_oid_hex(buf, oid, &p) || (*p != '\0' && !isspace(*p))) { *type |= REF_ISBROKEN; - errno = EINVAL; + *failure_errno = EINVAL; return -1; } return 0;
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index 54f57c6a2df..bf581e70cf6 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h@@ -689,10 +689,12 @@ struct ref_store { }; /* - * Parse contents of a loose ref file. + * Parse contents of a loose ref file. *failure_errno maybe be set to EINVAL for + * invalid contents. */ int parse_loose_ref_contents(const char *buf, struct object_id *oid, - struct strbuf *referent, unsigned int *type); + struct strbuf *referent, unsigned int *type, + int *failure_errno); /* * Fill in the generic part of refs and add it to our collection of
--
gitgitgadget