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);
}
/* 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;
}
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
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;
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;
}
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);