From dad3f0607bf1c864f80723ab20b39527260f2c4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Thu, 5 Sep 2019 21:55:55 +0200 Subject: tag: factor out get_tagged_oid() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a function for accessing the ID of the object referenced by a tag safely, i.e. without causing a segfault when encountering a broken tag where ->tagged is NULL. Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- pack-bitmap.c | 4 +--- revision.c | 4 +--- tag.c | 7 +++++++ tag.h | 1 + 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pack-bitmap.c b/pack-bitmap.c index ed2befaac6..30842e1e74 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -709,9 +709,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs) else object_list_insert(object, &wants); - if (!tag->tagged) - die("bad tag"); - object = parse_object_or_die(&tag->tagged->oid, NULL); + object = parse_object_or_die(get_tagged_oid(tag), NULL); } if (object->flags & UNINTERESTING) diff --git a/revision.c b/revision.c index 07412297f0..ee1b1552b9 100644 --- a/revision.c +++ b/revision.c @@ -404,9 +404,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct tag *tag = (struct tag *) object; if (revs->tag_objects && !(flags & UNINTERESTING)) add_pending_object(revs, object, tag->tag); - if (!tag->tagged) - die("bad tag"); - object = parse_object(revs->repo, &tag->tagged->oid); + object = parse_object(revs->repo, get_tagged_oid(tag)); if (!object) { if (revs->ignore_missing_links || (flags & UNINTERESTING)) return NULL; diff --git a/tag.c b/tag.c index 5db870edb9..bfa0e31435 100644 --- a/tag.c +++ b/tag.c @@ -212,3 +212,10 @@ int parse_tag(struct tag *item) free(data); return ret; } + +struct object_id *get_tagged_oid(struct tag *tag) +{ + if (!tag->tagged) + die("bad tag"); + return &tag->tagged->oid; +} diff --git a/tag.h b/tag.h index 03265fbfe2..3ce8e72192 100644 --- a/tag.h +++ b/tag.h @@ -19,5 +19,6 @@ struct object *deref_tag(struct repository *r, struct object *, const char *, in struct object *deref_tag_noverify(struct object *); int gpg_verify_tag(const struct object_id *oid, const char *name_to_report, unsigned flags); +struct object_id *get_tagged_oid(struct tag *tag); #endif /* TAG_H */ -- cgit v1.2.3