int errno_save;
u64 *chunk_offsets = NULL;
+ u8 *_ubuf = NULL;
u8 *ubuf = NULL;
void *cbuf = NULL;
bool chunk_offsets_malloced = false;
/* 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
if (chunk_offsets_malloced)
FREE(chunk_offsets);
if (ubuf_malloced)
- FREE(ubuf);
+ FREE(_ubuf);
if (cbuf_malloced)
FREE(cbuf);
errno = errno_save;
return (*ctx->cbs.end_stream)(lte, ret, ctx->cbs.end_stream_ctx);
}
-static int
+int
read_full_stream_with_cbs(struct wim_lookup_table_entry *lte,
const struct read_stream_list_callbacks *cbs)
{