struct resource_entry_disk resource_entry;
/* Which part of the split WIM this stream is in; indexed from 1. */
- u16 part_number;
+ le16 part_number;
/* Reference count of this stream over all WIM images. */
- u32 refcnt;
+ le32 refcnt;
/* SHA1 message digest of the uncompressed data of this stream, or
* optionally all zeroes if this stream is of zero length. */
u8 hash[SHA1_HASH_SIZE];
} _packed_attribute;
+#define WIM_LOOKUP_TABLE_ENTRY_DISK_SIZE 50
+
/*
* Reads the lookup table from a WIM file.
*
struct wim_lookup_table_entry_disk
table_buf[BUFFER_SIZE / sizeof(struct wim_lookup_table_entry_disk)]
_aligned_attribute(8);
+
+ BUILD_BUG_ON(sizeof(struct wim_lookup_table_entry_disk) !=
+ WIM_LOOKUP_TABLE_ENTRY_DISK_SIZE);
+
off_t offset;
size_t buf_entries_remaining;
const struct wim_lookup_table_entry_disk *disk_entry;
num_entries = w->hdr.lookup_table_res_entry.size /
sizeof(struct wim_lookup_table_entry_disk);
table = new_lookup_table(num_entries * 2 + 1);
- if (!table)
+ if (!table) {
+ ERROR("Failed to allocate stream hash table of size %zu",
+ num_entries * 2 + 1);
return WIMLIB_ERR_NOMEM;
+ }
w->current_image = 0;
offset = w->hdr.lookup_table_res_entry.offset;
copy_hash(cur_entry->hash, disk_entry->hash);
if (cur_entry->part_number != w->hdr.part_number) {
- ERROR("A lookup table entry in part %hu of the WIM "
- "points to part %hu",
- w->hdr.part_number, cur_entry->part_number);
- ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
- goto out_free_cur_entry;
+ WARNING("A lookup table entry in part %hu of the WIM "
+ "points to part %hu (ignoring it)",
+ w->hdr.part_number, cur_entry->part_number);
+ free_lookup_table_entry(cur_entry);
+ continue;
}
if (is_zero_hash(cur_entry->hash)) {
- ERROR("The WIM lookup table contains an entry with a "
- "SHA1 message digest of all 0's");
- ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
- goto out_free_cur_entry;
+ WARNING("The WIM lookup table contains an entry with a "
+ "SHA1 message digest of all 0's (ignoring it)");
+ free_lookup_table_entry(cur_entry);
+ continue;
}
if (!(cur_entry->resource_entry.flags & WIM_RESHDR_FLAG_COMPRESSED)
&& (cur_entry->resource_entry.size !=
cur_entry->resource_entry.original_size))
{
- #ifdef ENABLE_ERROR_MESSAGES
- ERROR("Found uncompressed resource with original size "
- "not the same as compressed size");
- ERROR("The lookup table entry for the resource is as follows:");
- print_lookup_table_entry(cur_entry, stderr);
- #endif
- ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
- goto out_free_cur_entry;
+ if (wimlib_print_errors) {
+ WARNING("Found uncompressed resource with "
+ "original size (%"PRIu64") not the same "
+ "as compressed size (%"PRIu64")",
+ cur_entry->resource_entry.original_size,
+ cur_entry->resource_entry.size);
+ if (cur_entry->resource_entry.original_size) {
+ WARNING("Overriding compressed size with original size.");
+ cur_entry->resource_entry.size =
+ cur_entry->resource_entry.original_size;
+ } else {
+ WARNING("Overriding original size with compressed size");
+ cur_entry->resource_entry.original_size =
+ cur_entry->resource_entry.size;
+ }
+ }
}
if (cur_entry->resource_entry.flags & WIM_RESHDR_FLAG_METADATA) {
/* Lookup table entry for a metadata resource */
if (cur_entry->refcnt != 1) {
- #ifdef ENABLE_ERROR_MESSAGES
- ERROR("Found metadata resource with refcnt != 1:");
- print_lookup_table_entry(cur_entry, stderr);
- #endif
+ if (wimlib_print_errors) {
+ ERROR("Found metadata resource with refcnt != 1:");
+ print_lookup_table_entry(cur_entry, stderr);
+ }
ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
goto out_free_cur_entry;
}
if (w->hdr.part_number != 1) {
- ERROR("Found a metadata resource in a "
- "non-first part of the split WIM!");
- ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
- goto out_free_cur_entry;
+ WARNING("Ignoring metadata resource found in a "
+ "non-first part of the split WIM");
+ free_lookup_table_entry(cur_entry);
+ continue;
}
if (w->current_image == w->hdr.image_count) {
- ERROR("The WIM header says there are %u images "
- "in the WIM, but we found more metadata "
- "resources than this", w->hdr.image_count);
- ret = WIMLIB_ERR_IMAGE_COUNT;
- goto out_free_cur_entry;
+ WARNING("The WIM header says there are %u images "
+ "in the WIM, but we found more metadata "
+ "resources than this (ignoring the extra)",
+ w->hdr.image_count);
+ free_lookup_table_entry(cur_entry);
+ continue;
}
/* Notice very carefully: We are assigning the metadata
* metadata resource */
duplicate_entry = __lookup_resource(table, cur_entry->hash);
if (duplicate_entry) {
- #ifdef ENABLE_ERROR_MESSAGES
- ERROR("The WIM lookup table contains two entries with the "
- "same SHA1 message digest!");
- ERROR("The first entry is:");
- print_lookup_table_entry(duplicate_entry, stderr);
- ERROR("The second entry is:");
- print_lookup_table_entry(cur_entry, stderr);
- #endif
- ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
- goto out_free_cur_entry;
+ if (wimlib_print_errors) {
+ WARNING("The WIM lookup table contains two entries with the "
+ "same SHA1 message digest!");
+ WARNING("The first entry is:");
+ print_lookup_table_entry(duplicate_entry, stderr);
+ WARNING("The second entry is:");
+ print_lookup_table_entry(cur_entry, stderr);
+ }
+ free_lookup_table_entry(cur_entry);
+ continue;
+ } else {
+ lookup_table_insert(table, cur_entry);
}
- lookup_table_insert(table, cur_entry);
}
}
* Prints the lookup table of a WIM file.
*/
WIMLIBAPI void
-wimlib_print_lookup_table(WIMStruct *w)
+wimlib_print_lookup_table(WIMStruct *wim)
{
- for_lookup_table_entry(w->lookup_table,
+ for (int i = 0; i < wim->hdr.image_count; i++)
+ print_lookup_table_entry(wim->image_metadata[i]->metadata_lte, stdout);
+ for_lookup_table_entry(wim->lookup_table,
do_print_lookup_table_entry,
stdout);
}