X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fresource.c;h=24526a8310370a443b7c838b43ae4805a8098c0d;hp=f7684b10baee9bab6fffaa109f0977e79a19d1ed;hb=b79d426cd90c506974f6c956a9af141b5d257d42;hpb=c5a50ca10987e37b7e880f71f342fd78270f27a0 diff --git a/src/resource.c b/src/resource.c index f7684b10..24526a83 100644 --- a/src/resource.c +++ b/src/resource.c @@ -26,7 +26,6 @@ # include "config.h" #endif -#include "wimlib.h" #include "wimlib/assert.h" #include "wimlib/endianness.h" #include "wimlib/error.h" @@ -138,6 +137,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, int errno_save; u64 *chunk_offsets = NULL; + u8 *_ubuf = NULL; u8 *ubuf = NULL; void *cbuf = NULL; bool chunk_offsets_malloced = false; @@ -206,7 +206,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, rspec->wim->decompressor_ctype = WIMLIB_COMPRESSION_TYPE_NONE; rspec->wim->decompressor = NULL; } else { - ret = wimlib_create_decompressor(ctype, chunk_size, NULL, + ret = wimlib_create_decompressor(ctype, chunk_size, &decompressor); if (ret) { if (ret != WIMLIB_ERR_NOMEM) @@ -368,13 +368,14 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec, /* Allocate buffer for holding the uncompressed data of each chunk. */ if (chunk_size <= STACK_MAX) { - ubuf = alloca(chunk_size); + _ubuf = alloca(chunk_size + 15); } else { - ubuf = MALLOC(chunk_size); - if (ubuf == NULL) + _ubuf = MALLOC(chunk_size + 15); + if (_ubuf == NULL) goto oom; ubuf_malloced = true; } + ubuf = (u8 *)(((uintptr_t)_ubuf + 15) & ~15); /* Allocate a temporary buffer for reading compressed chunks, each of * which can be at most @chunk_size - 1 bytes. This excludes compressed @@ -548,7 +549,7 @@ out_free_memory: if (chunk_offsets_malloced) FREE(chunk_offsets); if (ubuf_malloced) - FREE(ubuf); + FREE(_ubuf); if (cbuf_malloced) FREE(cbuf); errno = errno_save; @@ -1015,17 +1016,12 @@ streamifier_cb(const void *chunk, size_t size, void *_ctx) wimlib_assert(size <= ctx->cur_stream->size - ctx->cur_stream_offset); if (ctx->cur_stream_offset == 0) { - u32 flags; /* Starting a new stream. */ DEBUG("Begin new stream (size=%"PRIu64").", ctx->cur_stream->size); - flags = BEGIN_STREAM_FLAG_PARTIAL_RESOURCE; - if (size == ctx->cur_stream->size) - flags |= BEGIN_STREAM_FLAG_WHOLE_STREAM; ret = (*ctx->cbs.begin_stream)(ctx->cur_stream, - flags, ctx->cbs.begin_stream_ctx); if (ret) return ret; @@ -1071,8 +1067,7 @@ struct hasher_context { /* Callback for starting to read a stream while calculating its SHA1 message * digest. */ static int -hasher_begin_stream(struct wim_lookup_table_entry *lte, u32 flags, - void *_ctx) +hasher_begin_stream(struct wim_lookup_table_entry *lte, void *_ctx) { struct hasher_context *ctx = _ctx; @@ -1081,8 +1076,7 @@ hasher_begin_stream(struct wim_lookup_table_entry *lte, u32 flags, if (ctx->cbs.begin_stream == NULL) return 0; else - return (*ctx->cbs.begin_stream)(lte, flags, - ctx->cbs.begin_stream_ctx); + return (*ctx->cbs.begin_stream)(lte, ctx->cbs.begin_stream_ctx); } /* A consume_data_callback_t implementation that continues calculating the SHA1 @@ -1171,7 +1165,7 @@ read_full_stream_with_cbs(struct wim_lookup_table_entry *lte, { int ret; - ret = (*cbs->begin_stream)(lte, 0, cbs->begin_stream_ctx); + ret = (*cbs->begin_stream)(lte, cbs->begin_stream_ctx); if (ret) return ret;