X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fblob_table.c;h=0ddd13ad09901413fc23e21893b4ba7f13cebac7;hp=2d346e3539ecca661b774802a98f046dd7873960;hb=173bcff7f6950a89ee398d6058b4df8e67cf8675;hpb=aa3a2830cd4154238bc6a342ffea43d9ac69a14c diff --git a/src/blob_table.c b/src/blob_table.c index 2d346e35..0ddd13ad 100644 --- a/src/blob_table.c +++ b/src/blob_table.c @@ -143,21 +143,15 @@ clone_blob_descriptor(const struct blob_descriptor *old) 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) { + if (new->ntfs_loc->attr_name != NULL) { new->ntfs_loc->attr_name = - utf16le_dup(old->ntfs_loc->attr_name); + utf16le_dup(new->ntfs_loc->attr_name); if (new->ntfs_loc->attr_name == NULL) goto out_free; } } break; #endif - default: - break; } return new; @@ -193,7 +187,6 @@ blob_release_location(struct blob_descriptor *blob) #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); } @@ -318,7 +311,7 @@ enlarge_blob_table(struct blob_table *table) size_t old_capacity, new_capacity; struct hlist_head *old_array, *new_array; struct blob_descriptor *blob; - struct hlist_node *cur, *tmp; + struct hlist_node *tmp; size_t i; old_capacity = table->capacity; @@ -331,7 +324,7 @@ enlarge_blob_table(struct blob_table *table) table->capacity = new_capacity; for (i = 0; i < old_capacity; i++) { - hlist_for_each_entry_safe(blob, cur, tmp, &old_array[i], hash_list) { + hlist_for_each_entry_safe(blob, tmp, &old_array[i], hash_list) { hlist_del(&blob->hash_list); blob_table_insert_raw(table, blob); } @@ -366,10 +359,9 @@ lookup_blob(const struct blob_table *table, const u8 *hash) { size_t i; struct blob_descriptor *blob; - struct hlist_node *pos; i = load_size_t_unaligned(hash) % table->capacity; - hlist_for_each_entry(blob, pos, &table->array[i], hash_list) + hlist_for_each_entry(blob, &table->array[i], hash_list) if (hashes_equal(hash, blob->hash)) return blob; return NULL; @@ -382,11 +374,11 @@ for_blob_in_table(struct blob_table *table, int (*visitor)(struct blob_descriptor *, void *), void *arg) { struct blob_descriptor *blob; - struct hlist_node *pos, *tmp; + struct hlist_node *tmp; int ret; for (size_t i = 0; i < table->capacity; i++) { - hlist_for_each_entry_safe(blob, pos, tmp, &table->array[i], + hlist_for_each_entry_safe(blob, tmp, &table->array[i], hash_list) { ret = visitor(blob, arg); @@ -456,7 +448,7 @@ cmp_blobs_by_sequential_order(const void *p1, const void *p2) 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_u64(blob1->ntfs_loc->sort_key, blob2->ntfs_loc->sort_key); #endif default: /* No additional sorting order defined for this resource @@ -1358,7 +1350,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; } @@ -1394,10 +1387,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);