]> wimlib.net Git - wimlib/blobdiff - src/lookup_table.c
read_lookup_table(): Change some errors to warnings
[wimlib] / src / lookup_table.c
index 95708866c9197614588f23ecc0caa26ceac71d02..b79381f00bdd1e4273341b0454d9925e1771248a 100644 (file)
@@ -355,16 +355,18 @@ struct wim_lookup_table_entry_disk {
        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.
  *
@@ -382,6 +384,10 @@ read_lookup_table(WIMStruct *w)
        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;
@@ -399,8 +405,11 @@ read_lookup_table(WIMStruct *w)
        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;
@@ -439,57 +448,66 @@ read_lookup_table(WIMStruct *w)
                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
@@ -510,18 +528,19 @@ read_lookup_table(WIMStruct *w)
                         * 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);
                }
        }
 
@@ -752,9 +771,11 @@ do_print_lookup_table_entry(struct wim_lookup_table_entry *lte, void *fp)
  * 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);
 }