+static int revalidate_one(struct object_entry *entry,
+ void *data, char *type, unsigned long size)
+{
+ int err;
+ if (!data)
+ return -1;
+ if (size != entry->size)
+ return -1;
+ err = check_sha1_signature(entry->sha1, data, size,
+ type_names[entry->type]);
+ free(data);
+ return err;
+}
+
+/*
+ * we are going to reuse the existing pack entry data. make
+ * sure it is not corrupt.
+ */
+static int revalidate_pack_entry(struct object_entry *entry)
+{
+ void *data;
+ char type[20];
+ unsigned long size;
+ struct pack_entry e;
+
+ if (pack_to_stdout)
+ return 0;
+
+ e.p = entry->in_pack;
+ e.offset = entry->in_pack_offset;
+
+ /* the caller has already called use_packed_git() for us */
+ data = unpack_entry_gently(&e, type, &size);
+ return revalidate_one(entry, data, type, size);
+}
+
+static int revalidate_loose_object(struct object_entry *entry,
+ unsigned char *map,
+ unsigned long mapsize)
+{
+ /* we already know this is a loose object with new type header. */
+ void *data;
+ char type[20];
+ unsigned long size;
+
+ if (pack_to_stdout)
+ return 0;
+
+ data = unpack_sha1_file(map, mapsize, type, &size);
+ return revalidate_one(entry, data, type, size);
+}
+