[PATCH] grep: handle deref_tag() returning NULL
From: René Scharfe <hidden>
Date: 2020-10-11 16:03:59
Subsystem:
the rest · Maintainer:
Linus Torvalds
deref_tag() can return NULL. Exit gracefully in that case instead of blindly dereferencing the return value. .name shouldn't ever be NULL, but grep_object() handles that case explicitly, so let's be defensive here as well and show the broken object's ID if it happens to lack a name after all. Signed-off-by: René Scharfe <redacted> --- Patch generated with --function-context for easier review. builtin/grep.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
diff --git a/builtin/grep.c b/builtin/grep.c
index c8037388c6..e58e57504c 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c@@ -658,31 +658,42 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec, static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec, const struct object_array *list) { unsigned int i; int hit = 0; const unsigned int nr = list->nr; for (i = 0; i < nr; i++) { struct object *real_obj; obj_read_lock(); real_obj = deref_tag(opt->repo, list->objects[i].item, NULL, 0); obj_read_unlock(); + if (!real_obj) { + char hex[GIT_MAX_HEXSZ + 1]; + const char *name = list->objects[i].name; + + if (!name) { + oid_to_hex_r(hex, &list->objects[i].item->oid); + name = hex; + } + die(_("invalid object '%s' given."), name); + } + /* load the gitmodules file for this rev */ if (recurse_submodules) { submodule_free(opt->repo); obj_read_lock(); gitmodules_config_oid(&real_obj->oid); obj_read_unlock(); } if (grep_object(opt, pathspec, real_obj, list->objects[i].name, list->objects[i].path)) { hit = 1; if (opt->status_only) break; } } return hit; } --
2.28.0