From ef6a6d4317234fdadc562a74435b2cfed5346e7f Mon Sep 17 00:00:00 2001 From: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:51:08 +1000 Subject: [PATCH] Add `BrotliDecompressStreamUninit` for uninitialized buffer --- src/decode.rs | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 2f9afa1..6415561 100755 --- a/src/decode.rs +++ b/src/decode.rs @@ -1693,7 +1693,7 @@ fn WriteRingBuffer<'a, AllocU32: alloc::Allocator, AllocHC: alloc::Allocator>( available_out: &mut usize, - opt_output: Option<&mut [u8]>, + opt_output: Option<&mut [mem::MaybeUninit]>, output_offset: &mut usize, total_out: &mut usize, force: bool, @@ -1711,7 +1711,9 @@ fn WriteRingBuffer<'a, let start = fast_slice!((s.ringbuffer)[start_index ; start_index + num_written as usize]); if let Some(output) = opt_output { fast_mut!((output)[*output_offset ; *output_offset + num_written as usize]) - .clone_from_slice(start); + .iter_mut() + .zip(start) + .for_each(|(maybe_uninit, byte)| { maybe_uninit.write(*byte); }); } *output_offset += num_written; *available_out -= num_written; @@ -1753,7 +1755,7 @@ fn CopyUncompressedBlockToOutput, AllocU32: alloc::Allocator, AllocHC: alloc::Allocator> (mut available_out: &mut usize, - mut output: &mut [u8], + mut output: &mut [mem::MaybeUninit], mut output_offset: &mut usize, mut total_out: &mut usize, mut s: &mut BrotliState, @@ -2664,12 +2666,37 @@ pub fn BrotliMaxDistanceSymbol(ndirect: u32, npostfix: u32) -> u32{ pub fn BrotliDecompressStream, AllocU32: alloc::Allocator, AllocHC: alloc::Allocator> + (available_in: &mut usize, + input_offset: &mut usize, + xinput: &[u8], + available_out: &mut usize, + output_offset: &mut usize, + output: &mut [u8], + total_out: &mut usize, + s: &mut BrotliState) + -> BrotliResult { + BrotliDecompressStreamUninit( + available_in, + input_offset, + xinput, + available_out, + output_offset, + // SAFETY: brotli never writes uninitialized buffer to already initialized `output` + unsafe { &mut *(output as *mut _ as *mut [mem::MaybeUninit]) }, + total_out, + s, + ) +} + +pub fn BrotliDecompressStreamUninit, + AllocU32: alloc::Allocator, + AllocHC: alloc::Allocator> (available_in: &mut usize, input_offset: &mut usize, xinput: &[u8], mut available_out: &mut usize, mut output_offset: &mut usize, - mut output: &mut [u8], + mut output: &mut [mem::MaybeUninit], mut total_out: &mut usize, mut s: &mut BrotliState) -> BrotliResult {