X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fresource.c;h=192ffb2e988470252f92fda501a226664ee3f04c;hp=1a46e751184377863f53f7b11582db44e6662d00;hb=4f433755e8f9ef79dbb4699430d047f74e338e82;hpb=883833a4b3dabec325edf1ca938000f91d587c00 diff --git a/src/resource.c b/src/resource.c index 1a46e751..192ffb2e 100644 --- a/src/resource.c +++ b/src/resource.c @@ -141,7 +141,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, bool chunk_offsets_malloced = false; bool ubuf_malloced = false; bool cbuf_malloced = false; - struct wimlib_decompressor *decompressor; + struct wimlib_decompressor *decompressor = NULL; /* Sanity checks */ wimlib_assert(rspec != NULL); @@ -443,7 +443,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, ERROR("Invalid chunk size in compressed resource!"); errno = EINVAL; ret = WIMLIB_ERR_DECOMPRESSION; - goto out_save_decompressor; + goto out_free_memory; } if (rspec->is_pipable) cur_read_offset += sizeof(struct pwm_chunk_hdr); @@ -496,7 +496,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, ERROR("Failed to decompress data!"); ret = WIMLIB_ERR_DECOMPRESSION; errno = EINVAL; - goto out_save_decompressor; + goto out_free_memory; } } cur_read_offset += chunk_csize; @@ -517,7 +517,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, ret = (*cb)(&ubuf[start], size, cb_ctx); if (ret) - goto out_save_decompressor; + goto out_free_memory; cur_range_pos += size; if (cur_range_pos == cur_range_end) { @@ -548,13 +548,15 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, goto read_error; } ret = 0; -out_save_decompressor: - wimlib_free_decompressor(rspec->wim->decompressor); - rspec->wim->decompressor = decompressor; - rspec->wim->decompressor_ctype = ctype; - rspec->wim->decompressor_max_block_size = chunk_size; + out_free_memory: errno_save = errno; + if (decompressor) { + wimlib_free_decompressor(rspec->wim->decompressor); + rspec->wim->decompressor = decompressor; + rspec->wim->decompressor_ctype = ctype; + rspec->wim->decompressor_max_block_size = chunk_size; + } if (chunk_offsets_malloced) FREE(chunk_offsets); if (ubuf_malloced) @@ -945,6 +947,8 @@ streamifier_cb(const void *chunk, size_t size, void *_ctx) if (ctx->cur_stream_offset == ctx->cur_stream->size) { /* Finished reading all the data for a stream. */ + ctx->cur_stream_offset = 0; + DEBUG("End stream (size=%"PRIu64").", ctx->cur_stream->size); ret = (*ctx->cbs.end_stream)(ctx->cur_stream, 0, ctx->cbs.end_stream_ctx); @@ -960,7 +964,6 @@ streamifier_cb(const void *chunk, size_t size, void *_ctx) else ctx->next_stream = NULL; } - ctx->cur_stream_offset = 0; } return 0; }