X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=object.c;h=5a5ebe27b0db0506dc1a6606d30e328c53275c18;hb=9786f68bfcc082778aee74159540e341bb239514;hp=37d1363359eb54070ed4dc52b9e96d4ad9457db3;hpb=39231b1c32caee10c7ac3397341ea0c6cf56e7f9;p=git.git diff --git a/object.c b/object.c index 37d136335..5a5ebe27b 100644 --- a/object.c +++ b/object.c @@ -136,32 +136,44 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t struct object *obj; int eaten = 0; + obj = NULL; if (type == OBJ_BLOB) { struct blob *blob = lookup_blob(sha1); - parse_blob_buffer(blob, buffer, size); - obj = &blob->object; + if (blob) { + parse_blob_buffer(blob, buffer, size); + obj = &blob->object; + } } else if (type == OBJ_TREE) { struct tree *tree = lookup_tree(sha1); - obj = &tree->object; - if (!tree->object.parsed) { - parse_tree_buffer(tree, buffer, size); - eaten = 1; + if (tree) { + obj = &tree->object; + if (!tree->object.parsed) { + parse_tree_buffer(tree, buffer, size); + eaten = 1; + } } } else if (type == OBJ_COMMIT) { struct commit *commit = lookup_commit(sha1); - parse_commit_buffer(commit, buffer, size); - if (!commit->buffer) { - commit->buffer = buffer; - eaten = 1; + if (commit) { + parse_commit_buffer(commit, buffer, size); + if (!commit->buffer) { + commit->buffer = buffer; + eaten = 1; + } + obj = &commit->object; } - obj = &commit->object; } else if (type == OBJ_TAG) { struct tag *tag = lookup_tag(sha1); - parse_tag_buffer(tag, buffer, size); - obj = &tag->object; + if (tag) { + parse_tag_buffer(tag, buffer, size); + obj = &tag->object; + } } else { + warning("object %s has unknown type id %d\n", sha1_to_hex(sha1), type); obj = NULL; } + if (obj && obj->type == OBJ_NONE) + obj->type = type; *eaten_p = eaten; return obj; } @@ -176,6 +188,7 @@ struct object *parse_object(const unsigned char *sha1) if (buffer) { struct object *obj; if (check_sha1_signature(sha1, buffer, size, typename(type)) < 0) { + free(buffer); error("sha1 mismatch %s\n", sha1_to_hex(sha1)); return NULL; }