- struct dentry *dentry;
- struct wim_security_data *sd;
- struct link_group_table *lgt;
- const struct lookup_table_entry *metadata_lte;
- const struct resource_entry *res_entry;
-
- metadata_lte = imd->metadata_lte;
- res_entry = &metadata_lte->resource_entry;
-
- DEBUG("Reading metadata resource: length = %"PRIu64", "
- "offset = %"PRIu64"",
- res_entry->original_size, res_entry->offset);
-
- if (res_entry->original_size < 8) {
- ERROR("Expected at least 8 bytes for the metadata resource");
- return WIMLIB_ERR_INVALID_RESOURCE_SIZE;
- }
-
- /* Allocate memory for the uncompressed metadata resource. */
- buf = MALLOC(res_entry->original_size);
-
- if (!buf) {
- ERROR("Failed to allocate %"PRIu64" bytes for uncompressed "
- "metadata resource", res_entry->original_size);
- return WIMLIB_ERR_NOMEM;
- }
-
- /* Determine the compression type of the metadata resource. */
-
- /* Read the metadata resource into memory. (It may be compressed.) */
- ret = read_full_wim_resource(metadata_lte, buf);
- if (ret != 0)
- goto out_free_buf;
-
- DEBUG("Finished reading metadata resource into memory.");
-
- /* The root directory entry starts after security data, on an 8-byte
- * aligned address.
- *
- * The security data starts with a 4-byte integer giving its total
- * length. */
-
- /* Read the security data into a wim_security_data structure. */
- ret = read_security_data(buf, res_entry->original_size, &sd);
- if (ret != 0)
- goto out_free_buf;
-
- dentry = MALLOC(sizeof(struct dentry));
- if (!dentry) {
- ERROR("Failed to allocate %zu bytes for root dentry",
- sizeof(struct dentry));
- ret = WIMLIB_ERR_NOMEM;
- goto out_free_security_data;
+ if (size == wim_resource_size(lte)) {
+ /* Do SHA1 */
+ struct extract_ctx ctx;
+ ctx.extract_chunk = extract_chunk;
+ ctx.extract_chunk_arg = extract_chunk_arg;
+ sha1_init(&ctx.sha_ctx);
+ ret = read_resource_prefix(lte, size,
+ extract_chunk_sha1_wrapper,
+ &ctx, 0);
+ if (ret == 0) {
+ u8 hash[SHA1_HASH_SIZE];
+ sha1_final(hash, &ctx.sha_ctx);
+ if (!hashes_equal(hash, lte->hash)) {
+ #ifdef ENABLE_ERROR_MESSAGES
+ ERROR_WITH_ERRNO("Invalid SHA1 message digest "
+ "on the following WIM resource:");
+ print_lookup_table_entry(lte, stderr);
+ if (lte->resource_location == RESOURCE_IN_WIM)
+ ERROR("The WIM file appears to be corrupt!");
+ ret = WIMLIB_ERR_INVALID_RESOURCE_HASH;
+ #endif
+ }
+ }
+ } else {
+ /* Don't do SHA1 */
+ ret = read_resource_prefix(lte, size, extract_chunk,
+ extract_chunk_arg, 0);