X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fresource.c;h=2c04882eb30e60526e2700edbe122de08ba959eb;hb=be5acf31aa8292dcd4a2829492faefb0b200d28f;hp=f3e1349b7e6b943d42da039be63df3f1d9caebcb;hpb=3de1ec66f778edda19865482d685bc6f4e17faf7;p=wimlib diff --git a/src/resource.c b/src/resource.c index f3e1349b..2c04882e 100644 --- a/src/resource.c +++ b/src/resource.c @@ -769,8 +769,6 @@ read_file_on_disk_prefix(const struct blob_descriptor *blob, u64 size, int raw_fd; struct filedes fd; - wimlib_assert(size <= blob->size); - DEBUG("Reading %"PRIu64" bytes from \"%"TS"\"", size, blob->file_on_disk); raw_fd = topen(blob->file_on_disk, O_BINARY | O_RDONLY); @@ -793,8 +791,6 @@ read_staging_file_prefix(const struct blob_descriptor *blob, u64 size, struct filedes fd; int ret; - wimlib_assert(size <= blob->size); - DEBUG("Reading %"PRIu64" bytes from staging file \"%s\"", size, blob->staging_file_name); @@ -818,7 +814,6 @@ static int read_buffer_prefix(const struct blob_descriptor *blob, u64 size, consume_data_callback_t cb, void *cb_ctx) { - wimlib_assert(size <= blob->size); return (*cb)(blob->attached_buffer, size, cb_ctx); } @@ -863,6 +858,7 @@ read_blob_prefix(const struct blob_descriptor *blob, u64 size, }; wimlib_assert(blob->blob_location < ARRAY_LEN(handlers) && handlers[blob->blob_location] != NULL); + wimlib_assert(size <= blob->size); return handlers[blob->blob_location](blob, size, cb, cb_ctx); } @@ -909,25 +905,12 @@ int wim_reshdr_to_data(const struct wim_reshdr *reshdr, WIMStruct *wim, void **buf_ret) { struct wim_resource_descriptor rdesc; - struct blob_descriptor *blob; - int ret; + struct blob_descriptor blob; wim_res_hdr_to_desc(reshdr, wim, &rdesc); + blob_set_is_located_in_nonsolid_wim_resource(&blob, &rdesc); - blob = new_blob_descriptor(); - if (!blob) - return WIMLIB_ERR_NOMEM; - - blob_set_is_located_in_wim_resource(blob, &rdesc); - blob->flags = rdesc.flags; - blob->size = rdesc.uncompressed_size; - blob->offset_in_res = 0; - - ret = read_full_blob_into_alloc_buf(blob, buf_ret); - - blob_unset_is_located_in_wim_resource(blob); - free_blob_descriptor(blob); - return ret; + return read_full_blob_into_alloc_buf(&blob, buf_ret); } int @@ -935,27 +918,18 @@ wim_reshdr_to_hash(const struct wim_reshdr *reshdr, WIMStruct *wim, u8 hash[SHA1_HASH_SIZE]) { struct wim_resource_descriptor rdesc; + struct blob_descriptor blob; int ret; - struct blob_descriptor *blob; wim_res_hdr_to_desc(reshdr, wim, &rdesc); + blob_set_is_located_in_nonsolid_wim_resource(&blob, &rdesc); + blob.unhashed = 1; - blob = new_blob_descriptor(); - if (blob == NULL) - return WIMLIB_ERR_NOMEM; - - blob_set_is_located_in_wim_resource(blob, &rdesc); - blob->flags = rdesc.flags; - blob->size = rdesc.uncompressed_size; - blob->offset_in_res = 0; - blob->unhashed = 1; - - ret = sha1_blob(blob); - - blob_unset_is_located_in_wim_resource(blob); - copy_hash(hash, blob->hash); - free_blob_descriptor(blob); - return ret; + ret = sha1_blob(&blob); + if (ret) + return ret; + copy_hash(hash, blob.hash); + return 0; } struct blobifier_context { @@ -1107,7 +1081,7 @@ hasher_end_blob(struct blob_descriptor *blob, int status, void *_ctx) tchar actual_hashstr[SHA1_HASH_SIZE * 2 + 1]; sprint_hash(blob->hash, expected_hashstr); sprint_hash(hash, actual_hashstr); - ERROR("The blob is corrupted!\n" + ERROR("The data is corrupted!\n" " (Expected SHA-1=%"TS",\n" " got SHA-1=%"TS")", expected_hashstr, actual_hashstr); @@ -1282,9 +1256,9 @@ read_blobs_in_solid_resource(struct blob_descriptor *first_blob, */ int read_blob_list(struct list_head *blob_list, - size_t list_head_offset, - const struct read_blob_list_callbacks *cbs, - int flags) + size_t list_head_offset, + const struct read_blob_list_callbacks *cbs, + int flags) { int ret; struct list_head *cur, *next; @@ -1323,10 +1297,9 @@ read_blob_list(struct list_head *blob_list, { blob = (struct blob_descriptor*)((u8*)cur - list_head_offset); - if (blob->flags & WIM_RESHDR_FLAG_SOLID && + if (blob->blob_location == BLOB_IN_WIM && blob->size != blob->rdesc->uncompressed_size) { - struct blob_descriptor *blob_next, *blob_last; struct list_head *next2; u64 blob_count;