If `snapshot->buf` is NULL, then `find_reference_location()` has two problems: 1. It relies on behavior that is technically undefined in C, such as computing `NULL + 0`. 2. It returns NULL if the reference doesn't exist, even if `mustexist` is not set. This problem doesn't come up in the current code, because we never call this function with `snapshot->buf == NULL` and `mustexist` set. But it is something that future callers need to be aware of. We could fix the first problem by adding some extra logic to the function. But considering both problems together, it is more straightforward to document that the function should only be called if `snapshot->buf` is non-NULL. Adjust `packed_read_raw_ref()` to return early if `snapshot->buf` is NULL rather than calling `find_reference_location()`. Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- refs/packed-backend.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/refs/packed-backend.c b/refs/packed-backend.c index 36796d65f0..ed2b396bef 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -521,8 +521,9 @@ static int load_contents(struct snapshot *snapshot) * reference name; for example, one could search for "refs/replace/" * to find the start of any replace references. * + * This function must only be called if `snapshot->buf` is non-NULL. * The record is sought using a binary search, so `snapshot->buf` must - * be sorted. + * also be sorted. */ static const char *find_reference_location(struct snapshot *snapshot, const char *refname, int mustexist) @@ -728,6 +729,12 @@ static int packed_read_raw_ref(struct ref_store *ref_store, *type = 0; + if (!snapshot->buf) { + /* There are no packed references */ + errno = ENOENT; + return -1; + } + rec = find_reference_location(snapshot, refname, 1); if (!rec) { -- 2.14.2