X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fresource.c;h=53283f2c3c5b3edf632331024910098e48b9bcf5;hb=386f6bd95d4579f4d54afdf40c602b85a6f19245;hp=f7684b10baee9bab6fffaa109f0977e79a19d1ed;hpb=c5a50ca10987e37b7e880f71f342fd78270f27a0;p=wimlib diff --git a/src/resource.c b/src/resource.c index f7684b10..53283f2c 100644 --- a/src/resource.c +++ b/src/resource.c @@ -138,6 +138,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; @@ -368,13 +369,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 +550,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 +1017,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 +1068,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 +1077,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 +1166,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;