{"thread":{"id":"12167","subject":"[PATCH 2/3] deref_tag: handle tag->tagged = NULL","startedAt":"2008-02-18T07:31:54Z","lastAt":"2008-02-18T08:40:33Z","messageCount":5,"participants":["Martin Koegler","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"69093","messageId":"12033199162949-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"12167","inReplyTo":null,"subject":"[PATCH 1/3] deref_tag: handle return value NULL","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2008-02-18T07:31:54Z","receivedAt":"2008-02-18T07:31:54Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n builtin-show-ref.c |    3 +++\n merge-recursive.c  |    2 ++\n sha1_name.c        |    5 ++++-\n shallow.c          |    2 +-\n upload-pack.c      |    3 ++-\n 5 files changed, 12 insertions(+), 3 deletions(-)\n\ndiff --git a/builtin-show-ref.c b/builtin-show-ref.c\nindex 65051d1..a323633 100644\n--- a/builtin-show-ref.c\n+++ b/builtin-show-ref.c\n@@ -86,6 +86,9 @@ match:\n \t\t\t    sha1_to_hex(sha1));\n \t\tif (obj->type == OBJ_TAG) {\n \t\t\tobj = deref_tag(obj, refname, 0);\n+\t\t\tif (!obj)\n+\t\t\t\tdie(\"git-show-ref: bad tag at ref %s (%s)\", refname,\n+\t\t\t\t    sha1_to_hex(sha1));\n \t\t\thex = find_unique_abbrev(obj->sha1, abbrev);\n \t\t\tprintf(\"%s %s^{}\\n\", hex, refname);\n \t\t}\ndiff --git a/merge-recursive.c b/merge-recursive.c\nindex dd52342..55ef76f 100644\n--- a/merge-recursive.c\n+++ b/merge-recursive.c\n@@ -1673,6 +1673,8 @@ static struct commit *get_ref(const char *ref)\n \tif (get_sha1(ref, sha1))\n \t\tdie(\"Could not resolve ref '%s'\", ref);\n \tobject = deref_tag(parse_object(sha1), ref, strlen(ref));\n+\tif (!object)\n+\t\treturn NULL;\n \tif (object->type == OBJ_TREE)\n \t\treturn make_virtual_commit((struct tree*)object,\n \t\t\tbetter_branch_name(ref));\ndiff --git a/sha1_name.c b/sha1_name.c\nindex be8489e..ed3c867 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -578,8 +578,11 @@ static int handle_one_ref(const char *path,\n \tstruct object *object = parse_object(sha1);\n \tif (!object)\n \t\treturn 0;\n-\tif (object->type == OBJ_TAG)\n+\tif (object->type == OBJ_TAG) {\n \t\tobject = deref_tag(object, path, strlen(path));\n+\t\tif (!object)\n+\t\t\treturn 0;\n+\t}\n \tif (object->type != OBJ_COMMIT)\n \t\treturn 0;\n \tinsert_by_date((struct commit *)object, list);\ndiff --git a/shallow.c b/shallow.c\nindex dbd9f5a..212e62b 100644\n--- a/shallow.c\n+++ b/shallow.c\n@@ -56,7 +56,7 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,\n \t\t\tif (i < heads->nr) {\n \t\t\t\tcommit = (struct commit *)\n \t\t\t\t\tderef_tag(heads->objects[i++].item, NULL, 0);\n-\t\t\t\tif (commit->object.type != OBJ_COMMIT) {\n+\t\t\t\tif (!commit || commit->object.type != OBJ_COMMIT) {\n \t\t\t\t\tcommit = NULL;\n \t\t\t\t\tcontinue;\n \t\t\t\t}\ndiff --git a/upload-pack.c b/upload-pack.c\nindex 7e04311..2307f58 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -575,7 +575,8 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo\n \t}\n \tif (o->type == OBJ_TAG) {\n \t\to = deref_tag(o, refname, 0);\n-\t\tpacket_write(1, \"%s %s^{}\\n\", sha1_to_hex(o->sha1), refname);\n+\t\tif (o)\n+\t\t\tpacket_write(1, \"%s %s^{}\\n\", sha1_to_hex(o->sha1), refname);\n \t}\n \treturn 0;\n }\n-- \n1.5.4.1.gaf0ae\n"},{"id":"69092","messageId":"1203319916670-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"12167","inReplyTo":"12033199162949-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 2/3] deref_tag: handle tag->tagged = NULL","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2008-02-18T07:31:55Z","receivedAt":"2008-02-18T07:31:55Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n tag.c |    5 ++++-\n 1 files changed, 4 insertions(+), 1 deletions(-)\n\ndiff --git a/tag.c b/tag.c\nindex 38bf913..990134f 100644\n--- a/tag.c\n+++ b/tag.c\n@@ -9,7 +9,10 @@ const char *tag_type = \"tag\";\n struct object *deref_tag(struct object *o, const char *warn, int warnlen)\n {\n \twhile (o && o->type == OBJ_TAG)\n-\t\to = parse_object(((struct tag *)o)->tagged->sha1);\n+\t\tif (((struct tag *)o)->tagged)\n+\t\t\to = parse_object(((struct tag *)o)->tagged->sha1);\n+\t\telse\n+\t\t\to = NULL;\n \tif (!o && warn) {\n \t\tif (!warnlen)\n \t\t\twarnlen = strlen(warn);\n-- \n1.5.4.1.gaf0ae\n"},{"id":"69094","messageId":"12033199168-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"12167","inReplyTo":"1203319916670-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 3/3] check return code of prepare_revision_walk","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2008-02-18T07:31:56Z","receivedAt":"2008-02-18T07:31:56Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"A failure in prepare_revision_walk can be caused by\na not parseable object.\n\nSigned-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n builtin-blame.c         |    3 ++-\n builtin-fast-export.c   |    3 ++-\n builtin-fmt-merge-msg.c |    3 ++-\n builtin-log.c           |   12 ++++++++----\n builtin-pack-objects.c  |    3 ++-\n builtin-rev-list.c      |    3 ++-\n builtin-shortlog.c      |    3 ++-\n bundle.c                |    3 ++-\n http-push.c             |    3 ++-\n reachable.c             |    3 ++-\n upload-pack.c           |    3 ++-\n 11 files changed, 28 insertions(+), 14 deletions(-)\n\ndiff --git a/builtin-blame.c b/builtin-blame.c\nindex ee45d8a..59d7237 100644\n--- a/builtin-blame.c\n+++ b/builtin-blame.c\n@@ -2367,7 +2367,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)\n \t * bottom commits we would reach while traversing as\n \t * uninteresting.\n \t */\n-\tprepare_revision_walk(&revs);\n+\tif (prepare_revision_walk(&revs))\n+\t\tdie(\"revision walk setup failed\");\n \n \tif (is_null_sha1(sb.final->object.sha1)) {\n \t\tchar *buf;\ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex ef27eee..f741df5 100755\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -383,7 +383,8 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \n \tget_tags_and_duplicates(&revs.pending, &extra_refs);\n \n-\tprepare_revision_walk(&revs);\n+\tif (prepare_revision_walk(&revs))\n+\t\tdie(\"revision walk setup failed\");\n \trevs.diffopt.format_callback = show_filemodify;\n \tDIFF_OPT_SET(&revs.diffopt, RECURSIVE);\n \twhile ((commit = get_revision(&revs))) {\ndiff --git a/builtin-fmt-merge-msg.c b/builtin-fmt-merge-msg.c\nindex 6163bd4..ebb3f37 100644\n--- a/builtin-fmt-merge-msg.c\n+++ b/builtin-fmt-merge-msg.c\n@@ -187,7 +187,8 @@ static void shortlog(const char *name, unsigned char *sha1,\n \tadd_pending_object(rev, branch, name);\n \tadd_pending_object(rev, &head->object, \"^HEAD\");\n \thead->object.flags |= UNINTERESTING;\n-\tprepare_revision_walk(rev);\n+\tif (prepare_revision_walk(rev))\n+\t\tdie(\"revision walk setup failed\");\n \twhile ((commit = get_revision(rev)) != NULL) {\n \t\tchar *oneline, *bol, *eol;\n \ndiff --git a/builtin-log.c b/builtin-log.c\nindex 99d69f0..5fea64a 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -197,7 +197,8 @@ static int cmd_log_walk(struct rev_info *rev)\n \tif (rev->early_output)\n \t\tsetup_early_output(rev);\n \n-\tprepare_revision_walk(rev);\n+\tif (prepare_revision_walk(rev))\n+\t\tdie(\"revision walk setup failed\");\n \n \tif (rev->early_output)\n \t\tfinish_early_output(rev);\n@@ -556,7 +557,8 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const cha\n \to2->flags ^= UNINTERESTING;\n \tadd_pending_object(&check_rev, o1, \"o1\");\n \tadd_pending_object(&check_rev, o2, \"o2\");\n-\tprepare_revision_walk(&check_rev);\n+\tif (prepare_revision_walk(&check_rev))\n+\t\tdie(\"revision walk setup failed\");\n \n \twhile ((commit = get_revision(&check_rev)) != NULL) {\n \t\t/* ignore merges */\n@@ -781,7 +783,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \tif (!use_stdout)\n \t\trealstdout = xfdopen(xdup(1), \"w\");\n \n-\tprepare_revision_walk(&rev);\n+\tif (prepare_revision_walk(&rev))\n+\t\tdie(\"revision walk setup failed\");\n \twhile ((commit = get_revision(&rev)) != NULL) {\n \t\t/* ignore merges */\n \t\tif (commit->parents && commit->parents->next)\n@@ -923,7 +926,8 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)\n \t\tdie(\"Unknown commit %s\", limit);\n \n \t/* reverse the list of commits */\n-\tprepare_revision_walk(&revs);\n+\tif (prepare_revision_walk(&revs))\n+\t\tdie(\"revision walk setup failed\");\n \twhile ((commit = get_revision(&revs)) != NULL) {\n \t\t/* ignore merges */\n \t\tif (commit->parents && commit->parents->next)\ndiff --git a/builtin-pack-objects.c b/builtin-pack-objects.c\nindex acb0555..fe95305 100644\n--- a/builtin-pack-objects.c\n+++ b/builtin-pack-objects.c\n@@ -2042,7 +2042,8 @@ static void get_object_list(int ac, const char **av)\n \t\t\tdie(\"bad revision '%s'\", line);\n \t}\n \n-\tprepare_revision_walk(&revs);\n+\tif (prepare_revision_walk(&revs))\n+\t\tdie(\"revision walk setup failed\");\n \tmark_edges_uninteresting(revs.commits, &revs, show_edge);\n \ttraverse_commit_list(&revs, show_commit, show_object);\n \ndiff --git a/builtin-rev-list.c b/builtin-rev-list.c\nindex de80158..9426081 100644\n--- a/builtin-rev-list.c\n+++ b/builtin-rev-list.c\n@@ -609,7 +609,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)\n \tif (bisect_list)\n \t\trevs.limited = 1;\n \n-\tprepare_revision_walk(&revs);\n+\tif (prepare_revision_walk(&revs))\n+\t\tdie(\"revision walk setup failed\");\n \tif (revs.tree_objects)\n \t\tmark_edges_uninteresting(revs.commits, &revs, show_edge);\n \ndiff --git a/builtin-shortlog.c b/builtin-shortlog.c\nindex fa8bc7d..0055a57 100644\n--- a/builtin-shortlog.c\n+++ b/builtin-shortlog.c\n@@ -136,7 +136,8 @@ static void get_from_rev(struct rev_info *rev, struct path_list *list)\n {\n \tstruct commit *commit;\n \n-\tprepare_revision_walk(rev);\n+\tif (prepare_revision_walk(rev))\n+\t\tdie(\"revision walk setup failed\");\n \twhile ((commit = get_revision(rev)) != NULL) {\n \t\tconst char *author = NULL, *buffer;\n \ndiff --git a/bundle.c b/bundle.c\nindex 5c95eca..bd12ec8 100644\n--- a/bundle.c\n+++ b/bundle.c\n@@ -128,7 +128,8 @@ int verify_bundle(struct bundle_header *header, int verbose)\n \t\tadd_object_array(e->item, e->name, &refs);\n \t}\n \n-\tprepare_revision_walk(&revs);\n+\tif (prepare_revision_walk(&revs))\n+\t\tdie(\"revision walk setup failed\");\n \n \ti = req_nr;\n \twhile (i && (commit = get_revision(&revs)))\ndiff --git a/http-push.c b/http-push.c\nindex b2b410d..63ff218 100644\n--- a/http-push.c\n+++ b/http-push.c\n@@ -2383,7 +2383,8 @@ int main(int argc, char **argv)\n \n \t\t/* Generate a list of objects that need to be pushed */\n \t\tpushing = 0;\n-\t\tprepare_revision_walk(&revs);\n+\t\tif (prepare_revision_walk(&revs))\n+\t\t\tdie(\"revision walk setup failed\");\n \t\tmark_edges_uninteresting(revs.commits);\n \t\tobjects_to_send = get_delta(&revs, ref_lock);\n \t\tfinish_all_active_slots();\ndiff --git a/reachable.c b/reachable.c\nindex 00f289f..823e324 100644\n--- a/reachable.c\n+++ b/reachable.c\n@@ -215,6 +215,7 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog)\n \t * Set up the revision walk - this will move all commits\n \t * from the pending list to the commit walking list.\n \t */\n-\tprepare_revision_walk(revs);\n+\tif (prepare_revision_walk(revs))\n+\t\tdie(\"revision walk setup failed\");\n \twalk_commit_list(revs);\n }\ndiff --git a/upload-pack.c b/upload-pack.c\nindex 2307f58..53676ee 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -129,7 +129,8 @@ static int do_rev_list(int fd, void *create_full_pack)\n \t\t}\n \t\tsetup_revisions(0, NULL, &revs, NULL);\n \t}\n-\tprepare_revision_walk(&revs);\n+\tif (prepare_revision_walk(&revs))\n+\t\tdie(\"revision walk setup failed\");\n \tmark_edges_uninteresting(revs.commits, &revs, show_edge);\n \ttraverse_commit_list(&revs, show_commit, show_object);\n \treturn 0;\n-- \n1.5.4.1.gaf0ae\n"},{"id":"69103","messageId":"7vr6far72s.fsf@gitster.siamese.dyndns.org","threadId":"12167","inReplyTo":"12033199168-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"Re: [PATCH 3/3] check return code of prepare_revision_walk","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-02-18T08:40:11Z","receivedAt":"2008-02-18T08:40:11Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Thanks.\n\nIt makes me wonder if it is cleaner to simply die() inside\nprepare_revision_walk() if all the callers are to do so\nanyway, though.\n\nBut we can do that easily later if that turns out to be\ndesired.\n"},{"id":"69104","messageId":"7vlk5ir726.fsf@gitster.siamese.dyndns.org","threadId":"12167","inReplyTo":"12033199162949-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"Re: [PATCH 1/3] deref_tag: handle return value NULL","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-02-18T08:40:33Z","receivedAt":"2008-02-18T08:40:33Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Martin Koegler <mkoegler@auto.tuwien.ac.at> writes:\n\n> Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n\nLooks good, thanks.\n"}]}