commit 5d844a1e3768d8c536169a754802b4bf8ebdd64c from: Stefan Sperling date: Tue Aug 13 13:41:46 2019 UTC don't attempt to parse Git's "leightweight" tags as real tag objects commit - 34ca489849f1d73f5e1ac4a68208fbb0601901fb commit + 5d844a1e3768d8c536169a754802b4bf8ebdd64c blob - 2a63d8f1f0a6106de69dbfe0a9a3082b29b5c066 blob + 263bc2cb88607d7fc3ebf4d3c07422a39951de68 --- got/got.c +++ got/got.c @@ -1402,8 +1402,13 @@ print_commit(struct got_commit_object *commit, struct name += 8; if (strncmp(name, "tags/", 5) == 0) { err = got_object_open_as_tag(&tag, repo, re->id); - if (err) - return err; + if (err) { + if (err->code != GOT_ERR_OBJ_TYPE) + return err; + /* Ref points at something other than a tag. */ + err = NULL; + tag = NULL; + } } cmp = got_object_id_cmp(tag ? got_object_tag_get_object_id(tag) : re->id, id); blob - 63fbc857f6aca730ac30a8872e56c453ca7b60a3 blob + 79ee0f0c8347e32173b918ab6724d3456a467899 --- lib/object.c +++ lib/object.c @@ -1307,6 +1307,8 @@ open_tag(struct got_tag_object **tag, struct got_repos struct got_packidx *packidx = NULL; int idx; char *path_packfile = NULL; + struct got_object *obj = NULL; + int obj_type = GOT_OBJ_TYPE_ANY; if (check_cache) { *tag = got_repo_get_cached_tag(repo, id); @@ -1332,14 +1334,36 @@ open_tag(struct got_tag_object **tag, struct got_repos if (err) goto done; } - err = read_packed_tag_privsep(tag, pack, - packidx, idx, id); + + /* Beware of "leightweight" tags: Check object type first. */ + err = read_packed_object_privsep(&obj, repo, pack, packidx, + idx, id); + if (err) + goto done; + obj_type = obj->type; + got_object_close(obj); + if (obj_type != GOT_OBJ_TYPE_TAG) { + err = got_error(GOT_ERR_OBJ_TYPE); + goto done; + } + err = read_packed_tag_privsep(tag, pack, packidx, idx, id); } else if (err->code == GOT_ERR_NO_OBJ) { int fd; err = open_loose_object(&fd, id, repo); if (err) return err; + err = read_object_header_privsep(&obj, repo, fd); + if (err) + return err; + obj_type = obj->type; + got_object_close(obj); + if (obj_type != GOT_OBJ_TYPE_TAG) + return got_error(GOT_ERR_OBJ_TYPE); + + err = open_loose_object(&fd, id, repo); + if (err) + return err; err = read_tag_privsep(tag, fd, repo); } blob - 68b3bebcf73256d66fd1896739ae25c59583aa4d blob + 330cb7270dac76c013148197dd78c6c658c5b281 --- tog/tog.c +++ tog/tog.c @@ -998,8 +998,13 @@ build_refs_str(char **refs_str, struct got_reflist_hea name += 8; if (strncmp(name, "tags/", 5) == 0) { err = got_object_open_as_tag(&tag, repo, re->id); - if (err) - break; + if (err) { + if (err->code != GOT_ERR_OBJ_TYPE) + break; + /* Ref points at something other than a tag. */ + err = NULL; + tag = NULL; + } } cmp = got_object_id_cmp(tag ? got_object_tag_get_object_id(tag) : re->id, id);