From aafd45229bb71219ddce1ab62619f714a53e204d Mon Sep 17 00:00:00 2001 From: Marc-Andre Lureau Date: Fri, 25 Jul 2025 21:11:17 +0400 Subject: [PATCH] fix(server): keep looping on compress_stream2() > 0 (#888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: 87df67fdc76 ("feat: add QOIZ image codec") --------- Signed-off-by: Marc-André Lureau Co-authored-by: Benoît Cortier <3809077+CBenoit@users.noreply.github.com> Changelog: ignore --- crates/ironrdp-server/src/encoder/mod.rs | 27 ++++++++++++++---------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/crates/ironrdp-server/src/encoder/mod.rs b/crates/ironrdp-server/src/encoder/mod.rs index 66e871b3..b7fc6192 100644 --- a/crates/ironrdp-server/src/encoder/mod.rs +++ b/crates/ironrdp-server/src/encoder/mod.rs @@ -504,19 +504,24 @@ impl BitmapUpdateHandler for QoizHandler { let qoi = qoi_encode(bitmap)?; let mut inb = zstd_safe::InBuffer::around(&qoi); let mut data = vec![0; qoi.len()]; - let mut outb = zstd_safe::OutBuffer::around(data.as_mut_slice()); + let mut outb; + let mut pos = 0; let mut zctxt = self.zctxt.lock().unwrap(); - let res = zctxt - .compress_stream2( - &mut outb, - &mut inb, - zstd_safe::zstd_sys::ZSTD_EndDirective::ZSTD_e_flush, - ) - .map_err(zstd_safe::get_error_name) - .unwrap(); - if res != 0 { - return Err(anyhow!("Failed to zstd compress")); + loop { + outb = zstd_safe::OutBuffer::around_pos(data.as_mut_slice(), pos); + let res = zctxt + .compress_stream2( + &mut outb, + &mut inb, + zstd_safe::zstd_sys::ZSTD_EndDirective::ZSTD_e_flush, + ) + .map_err(|code| anyhow!("failed to zstd compress: {}", zstd_safe::get_error_name(code)))?; + if res == 0 { + break; + } + pos = outb.pos(); + data.resize(data.len() + res, 0); } set_surface(bitmap, self.codec_id, outb.as_slice())