]> wimlib.net Git - wimlib/blobdiff - src/blob_table.c
Remove remaining DEBUG() messages
[wimlib] / src / blob_table.c
index bcccae8ba9ddb1ab96ef362cdab176756dcb375f..e9766b5f6419db7d1f35c4b79815a4169954a6ed 100644 (file)
@@ -138,26 +138,11 @@ clone_blob_descriptor(const struct blob_descriptor *old)
                break;
 #ifdef WITH_NTFS_3G
        case BLOB_IN_NTFS_VOLUME:
-               if (old->ntfs_loc) {
-                       new->ntfs_loc = memdup(old->ntfs_loc,
-                                              sizeof(struct ntfs_location));
-                       if (new->ntfs_loc == NULL)
-                               goto out_free;
-                       new->ntfs_loc->path = STRDUP(old->ntfs_loc->path);
-                       new->ntfs_loc->attr_name = NULL;
-                       if (new->ntfs_loc->path == NULL)
-                               goto out_free;
-                       if (new->ntfs_loc->attr_name_nchars != 0) {
-                               new->ntfs_loc->attr_name =
-                                       utf16le_dup(old->ntfs_loc->attr_name);
-                               if (new->ntfs_loc->attr_name == NULL)
-                                       goto out_free;
-                       }
-               }
+               new->ntfs_loc = clone_ntfs_location(old->ntfs_loc);
+               if (!new->ntfs_loc)
+                       goto out_free;
                break;
 #endif
-       default:
-               break;
        }
        return new;
 
@@ -192,15 +177,10 @@ blob_release_location(struct blob_descriptor *blob)
                break;
 #ifdef WITH_NTFS_3G
        case BLOB_IN_NTFS_VOLUME:
-               if (blob->ntfs_loc) {
-                       FREE(blob->ntfs_loc->path);
-                       FREE(blob->ntfs_loc->attr_name);
-                       FREE(blob->ntfs_loc);
-               }
+               if (blob->ntfs_loc)
+                       free_ntfs_location(blob->ntfs_loc);
                break;
 #endif
-       default:
-               break;
        }
 }
 
@@ -330,12 +310,9 @@ enlarge_blob_table(struct blob_table *table)
        table->array = new_array;
        table->capacity = new_capacity;
 
-       for (i = 0; i < old_capacity; i++) {
-               hlist_for_each_entry_safe(blob, tmp, &old_array[i], hash_list) {
-                       hlist_del(&blob->hash_list);
+       for (i = 0; i < old_capacity; i++)
+               hlist_for_each_entry_safe(blob, tmp, &old_array[i], hash_list)
                        blob_table_insert_raw(table, blob);
-               }
-       }
        FREE(old_array);
 }
 
@@ -415,7 +392,7 @@ cmp_blobs_by_sequential_order(const void *p1, const void *p2)
 
        v = (int)blob1->blob_location - (int)blob2->blob_location;
 
-       /* Different resource locations?  */
+       /* Different locations?  */
        if (v)
                return v;
 
@@ -426,7 +403,7 @@ cmp_blobs_by_sequential_order(const void *p1, const void *p2)
 
                /* Different (possibly split) WIMs?  */
                if (wim1 != wim2) {
-                       v = memcmp(wim1->hdr.guid, wim2->hdr.guid, WIM_GUID_LEN);
+                       v = cmp_guids(wim1->hdr.guid, wim2->hdr.guid);
                        if (v)
                                return v;
                }
@@ -449,13 +426,17 @@ cmp_blobs_by_sequential_order(const void *p1, const void *p2)
 #ifdef __WIN32__
        case BLOB_IN_WINNT_FILE_ON_DISK:
        case BLOB_WIN32_ENCRYPTED:
+               /* Windows: compare by starting LCN (logical cluster number)  */
+               v = cmp_u64(blob1->sort_key, blob2->sort_key);
+               if (v)
+                       return v;
 #endif
                /* Compare files by path: just a heuristic that will place files
                 * in the same directory next to each other.  */
                return tstrcmp(blob1->file_on_disk, blob2->file_on_disk);
 #ifdef WITH_NTFS_3G
        case BLOB_IN_NTFS_VOLUME:
-               return tstrcmp(blob1->ntfs_loc->path, blob2->ntfs_loc->path);
+               return cmp_ntfs_locations(blob1->ntfs_loc, blob2->ntfs_loc);
 #endif
        default:
                /* No additional sorting order defined for this resource
@@ -627,7 +608,7 @@ do_load_solid_info(WIMStruct *wim, struct wim_resource_descriptor **rdescs,
 
                rdesc = rdescs[i];
 
-               wim_res_hdr_to_desc(&reshdr, wim, rdesc);
+               wim_reshdr_to_desc(&reshdr, wim, rdesc);
 
                /* For solid resources, the uncompressed size, compression type,
                 * and chunk size are stored in the resource itself, not in the
@@ -651,17 +632,7 @@ do_load_solid_info(WIMStruct *wim, struct wim_resource_descriptor **rdescs,
                BUILD_BUG_ON(WIMLIB_COMPRESSION_TYPE_LZX != 2);
                BUILD_BUG_ON(WIMLIB_COMPRESSION_TYPE_LZMS != 3);
                rdesc->compression_type = le32_to_cpu(hdr.compression_format);
-
                rdesc->chunk_size = le32_to_cpu(hdr.chunk_size);
-
-               DEBUG("Solid resource %zu/%zu: %"PRIu64" => %"PRIu64" "
-                     "(%"TS"/%"PRIu32") @ +%"PRIu64"",
-                     i + 1, num_rdescs,
-                     rdesc->uncompressed_size,
-                     rdesc->size_in_wim,
-                     wimlib_get_compression_type_string(rdesc->compression_type),
-                     rdesc->chunk_size,
-                     rdesc->offset_in_wim);
        }
        return 0;
 }
@@ -872,13 +843,12 @@ read_blob_table(WIMStruct *wim)
        struct blob_table *table = NULL;
        struct blob_descriptor *cur_blob = NULL;
        size_t num_duplicate_blobs = 0;
+       size_t num_empty_blobs = 0;
        size_t num_wrong_part_blobs = 0;
        u32 image_index = 0;
        struct wim_resource_descriptor **cur_solid_rdescs = NULL;
        size_t cur_num_solid_rdescs = 0;
 
-       DEBUG("Reading blob table.");
-
        /* Calculate the number of entries in the blob table.  */
        num_entries = wim->hdr.blob_table_reshdr.uncompressed_size /
                      sizeof(struct blob_descriptor_disk);
@@ -905,13 +875,6 @@ read_blob_table(WIMStruct *wim)
                /* Get the resource header  */
                get_wim_reshdr(&disk_entry->reshdr, &reshdr);
 
-               DEBUG("reshdr: size_in_wim=%"PRIu64", "
-                     "uncompressed_size=%"PRIu64", "
-                     "offset_in_wim=%"PRIu64", "
-                     "flags=0x%02x",
-                     reshdr.size_in_wim, reshdr.uncompressed_size,
-                     reshdr.offset_in_wim, reshdr.flags);
-
                /* Ignore SOLID flag if it isn't supposed to be used in this WIM
                 * version.  */
                if (wim->hdr.wim_version == WIM_VERSION_DEFAULT)
@@ -969,27 +932,13 @@ read_blob_table(WIMStruct *wim)
                                        goto out;
                        }
 
-                       /* How to handle an uncompressed resource with its
-                        * uncompressed size different from its compressed size?
-                        *
-                        * Based on a simple test, WIMGAPI seems to handle this
-                        * as follows:
-                        *
-                        * if (size_in_wim > uncompressed_size) {
-                        *      Ignore uncompressed_size; use size_in_wim
-                        *      instead.
-                        * } else {
-                        *      Honor uncompressed_size, but treat the part of
-                        *      the file data above size_in_wim as all zeros.
-                        * }
-                        *
-                        * So we will do the same.  */
-                       if (unlikely(!(reshdr.flags &
-                                      WIM_RESHDR_FLAG_COMPRESSED) &&
-                                    (reshdr.size_in_wim >
-                                     reshdr.uncompressed_size)))
+                       if (unlikely(!(reshdr.flags & WIM_RESHDR_FLAG_COMPRESSED) &&
+                                    (reshdr.size_in_wim != reshdr.uncompressed_size)))
                        {
-                               reshdr.uncompressed_size = reshdr.size_in_wim;
+                               ERROR("Uncompressed resource has "
+                                     "size_in_wim != uncompressed_size");
+                               ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
+                               goto out;
                        }
 
                        /* Set up a resource descriptor for this blob.  */
@@ -998,20 +947,24 @@ read_blob_table(WIMStruct *wim)
                        if (!rdesc)
                                goto oom;
 
-                       wim_res_hdr_to_desc(&reshdr, wim, rdesc);
-
-                       blob_set_is_located_in_nonsolid_wim_resource(cur_blob, rdesc);
+                       wim_reshdr_to_desc_and_blob(&reshdr, wim, rdesc, cur_blob);
                }
 
                /* cur_blob is now a blob bound to a resource.  */
 
                /* Ignore entries with all zeroes in the hash field.  */
-               if (is_zero_hash(cur_blob->hash))
+               if (unlikely(is_zero_hash(cur_blob->hash)))
+                       goto free_cur_blob_and_continue;
+
+               /* Verify that the blob has nonzero size.  */
+               if (unlikely(cur_blob->size == 0)) {
+                       num_empty_blobs++;
                        goto free_cur_blob_and_continue;
+               }
 
                /* Verify that the part number matches that of the underlying
                 * WIM file.  */
-               if (part_number != wim->hdr.part_number) {
+               if (unlikely(part_number != wim->hdr.part_number)) {
                        num_wrong_part_blobs++;
                        goto free_cur_blob_and_continue;
                }
@@ -1038,6 +991,13 @@ read_blob_table(WIMStruct *wim)
                                goto out;
                        }
 
+                       if (reshdr.flags & WIM_RESHDR_FLAG_SOLID) {
+                               ERROR("Image metadata in solid resources "
+                                     "is unsupported.");
+                               ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
+                               goto out;
+                       }
+
                        if (wim->hdr.part_number != 1) {
                                WARNING("Ignoring metadata resource found in a "
                                        "non-first part of the split WIM");
@@ -1059,11 +1019,6 @@ read_blob_table(WIMStruct *wim)
                         * this overrides the actual locations of the metadata
                         * resources themselves in the WIM file as well as any
                         * information written in the XML data.  */
-                       DEBUG("Found metadata resource for image %"PRIu32" at "
-                             "offset %"PRIu64".",
-                             image_index + 1,
-                             reshdr.offset_in_wim);
-
                        wim->image_metadata[image_index++]->metadata_blob = cur_blob;
                } else {
                        /* Blob table entry for a non-metadata blob.  */
@@ -1107,12 +1062,14 @@ read_blob_table(WIMStruct *wim)
        if (num_duplicate_blobs > 0)
                WARNING("Ignoring %zu duplicate blobs", num_duplicate_blobs);
 
+       if (num_empty_blobs > 0)
+               WARNING("Ignoring %zu empty blobs", num_empty_blobs);
+
        if (num_wrong_part_blobs > 0) {
                WARNING("Ignoring %zu blobs with wrong part number",
                        num_wrong_part_blobs);
        }
 
-       DEBUG("Done reading blob table.");
        wim->blob_table = table;
        ret = 0;
        goto out_free_buf;
@@ -1172,9 +1129,6 @@ write_blob_table_from_blob_list(struct list_head *blob_list,
                }
        }
 
-       DEBUG("Writing WIM blob table (size=%zu, offset=%"PRIu64")",
-             table_size, out_fd->offset);
-
        table_buf = MALLOC(table_size);
        if (table_buf == NULL) {
                ERROR("Failed to allocate %zu bytes for temporary blob table",
@@ -1233,7 +1187,6 @@ write_blob_table_from_blob_list(struct list_head *blob_list,
                                             NULL,
                                             write_resource_flags);
        FREE(table_buf);
-       DEBUG("ret=%d", ret);
        return ret;
 }
 
@@ -1357,7 +1310,8 @@ blob_to_wimlib_resource_entry(const struct blob_descriptor *blob,
                wentry->is_spanned = (res_flags & WIM_RESHDR_FLAG_SPANNED) != 0;
                wentry->packed = (res_flags & WIM_RESHDR_FLAG_SOLID) != 0;
        }
-       copy_hash(wentry->sha1_hash, blob->hash);
+       if (!blob->unhashed)
+               copy_hash(wentry->sha1_hash, blob->hash);
        wentry->reference_count = blob->refcnt;
        wentry->is_metadata = blob->is_metadata;
 }
@@ -1393,10 +1347,17 @@ wimlib_iterate_lookup_table(WIMStruct *wim, int flags,
        if (wim_has_metadata(wim)) {
                int ret;
                for (int i = 0; i < wim->hdr.image_count; i++) {
-                       ret = do_iterate_blob(wim->image_metadata[i]->metadata_blob,
-                                             &ctx);
+                       struct blob_descriptor *blob;
+                       struct wim_image_metadata *imd = wim->image_metadata[i];
+
+                       ret = do_iterate_blob(imd->metadata_blob, &ctx);
                        if (ret)
                                return ret;
+                       image_for_each_unhashed_blob(blob, imd) {
+                               ret = do_iterate_blob(blob, &ctx);
+                               if (ret)
+                                       return ret;
+                       }
                }
        }
        return for_blob_in_table(wim->blob_table, do_iterate_blob, &ctx);