]> wimlib.net Git - wimlib/blobdiff - src/lookup_table.c
read_lookup_table(): Only warn when not enough metadata resources found
[wimlib] / src / lookup_table.c
index 47e6038859fd0b60ed3a2aacf2cd4ed09ed37818..199ea22188bd74e3237f8a0c4e8bef0bc4ed5580 100644 (file)
@@ -447,6 +447,11 @@ read_lookup_table(WIMStruct *w)
                cur_entry->refcnt = le32_to_cpu(disk_entry->refcnt);
                copy_hash(cur_entry->hash, disk_entry->hash);
 
+               if (cur_entry->resource_entry.flags & WIM_RESHDR_FLAG_COMPRESSED)
+                       cur_entry->compression_type = w->compression_type;
+               else
+                       BUILD_BUG_ON(WIMLIB_COMPRESSION_TYPE_NONE != 0);
+
                if (cur_entry->part_number != w->hdr.part_number) {
                        WARNING("A lookup table entry in part %hu of the WIM "
                                "points to part %hu (ignoring it)",
@@ -544,13 +549,15 @@ read_lookup_table(WIMStruct *w)
                }
        }
 
-       if (w->hdr.part_number == 1 && w->current_image != w->hdr.image_count)
-       {
-               ERROR("The WIM header says there are %u images "
-                     "in the WIM, but we only found %d metadata "
-                     "resources!", w->hdr.image_count, w->current_image);
-               ret = WIMLIB_ERR_IMAGE_COUNT;
-               goto out_free_lookup_table;
+       if (w->hdr.part_number == 1 && w->current_image != w->hdr.image_count) {
+               WARNING("The header of \"%"TS"\" says there are %u images in\n"
+                       "          the WIM, but we only found %d metadata resources!  Acting as if\n"
+                       "          the header specified only %d images instead.",
+                       w->filename, w->hdr.image_count,
+                       w->current_image, w->current_image);
+               for (int i = w->current_image; i < w->hdr.image_count; i++)
+                       put_image_metadata(w->image_metadata[i], NULL);
+               w->hdr.image_count = w->current_image;
        }
        DEBUG("Done reading lookup table.");
        w->lookup_table = table;
@@ -837,7 +844,9 @@ lookup_resource(WIMStruct *w,
 
        inode = dentry->d_inode;
 
-       wimlib_assert(inode->i_resolved);
+       if (!inode->i_resolved)
+               if (inode_resolve_ltes(inode, w->lookup_table))
+                       return -EIO;
 
        if (!(lookup_flags & LOOKUP_FLAG_DIRECTORY_OK)
              && inode_is_directory(inode))
@@ -870,19 +879,6 @@ out:
 }
 #endif
 
-/*
- * XXX Probably should store the compression type directly in the lookup table
- * entry
- */
-int
-wim_resource_compression_type(const struct wim_lookup_table_entry *lte)
-{
-       if (!(lte->resource_entry.flags & WIM_RESHDR_FLAG_COMPRESSED)
-           || lte->resource_location != RESOURCE_IN_WIM)
-               return WIMLIB_COMPRESSION_TYPE_NONE;
-       return wimlib_get_compression_type(lte->wim);
-}
-
 /* Resolve an inode's lookup table entries
  *
  * This replaces the SHA1 hash fields (which are used to lookup an entry in the
@@ -895,7 +891,6 @@ wim_resource_compression_type(const struct wim_lookup_table_entry *lte)
 int
 inode_resolve_ltes(struct wim_inode *inode, struct wim_lookup_table *table)
 {
-       int ret;
        const u8 *hash;
 
        if (!inode->i_resolved) {