From e2ac7cb5fbcf1407003aa07cdcd14141527ea2e3 Mon Sep 17 00:00:00 2001
From: Sam Vilain <sam.vilain@catalyst.net.nz>
Date: Wed, 6 Jun 2007 22:25:17 +1200
Subject: [PATCH] Don't assume tree entries that are not dirs are blobs

When scanning the trees in track_tree_refs() there is a "lazy" test
that assumes that entries are either directories or files.  Don't do
that.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 object.c | 3 +++
 tree.c   | 7 ++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/object.c b/object.c
index cfc4969ed9..16793d9958 100644
--- a/object.c
+++ b/object.c
@@ -160,8 +160,11 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
 		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;
 }
diff --git a/tree.c b/tree.c
index e4a39aa3c3..e946dac069 100644
--- a/tree.c
+++ b/tree.c
@@ -173,8 +173,13 @@ static void track_tree_refs(struct tree *item)
 			continue;
 		if (S_ISDIR(entry.mode))
 			obj = &lookup_tree(entry.sha1)->object;
-		else
+		else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode))
 			obj = &lookup_blob(entry.sha1)->object;
+		else {
+			warning("in tree %s: entry %s has bad mode %.6o\n",
+			     sha1_to_hex(item->object.sha1), entry.path, entry.mode);
+			obj = lookup_unknown_object(entry.sha1);
+		}
 		refs->ref[i++] = obj;
 	}
 	set_object_refs(&item->object, refs);
-- 
GitLab