From b6893b13cdbfd92fc5e5553777747dd9dd317358 Mon Sep 17 00:00:00 2001 From: Park Joon-Kyu Date: Sat, 10 May 2025 17:23:13 +0900 Subject: [PATCH] fix broken compression when feeding data larger than 64 KiB --- Cargo.lock | 13 +++++++++++++ actix-http/src/ws/deflate.rs | 10 +++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 63de68fe8..3afa9f6f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1320,6 +1320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", + "libz-sys", "miniz_oxide", ] @@ -1922,6 +1923,18 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linked-hash-map" version = "0.5.6" diff --git a/actix-http/src/ws/deflate.rs b/actix-http/src/ws/deflate.rs index 76bfebb35..239ebec2e 100644 --- a/actix-http/src/ws/deflate.rs +++ b/actix-http/src/ws/deflate.rs @@ -530,8 +530,8 @@ impl DeflateCompressionContext { let mut buf = [0u8; BUF_SIZE]; loop { - let total_in = self.compress.total_in() - self.total_bytes_read; - let res = if total_in >= payload.len() as u64 { + let bytes_in = self.compress.total_in() - self.total_bytes_read; + let res = if bytes_in >= payload.len() as u64 { self.compress .compress(&[], &mut buf, flate2::FlushCompress::Sync) .map_err(|err| { @@ -540,7 +540,11 @@ impl DeflateCompressionContext { })? } else { self.compress - .compress(&payload, &mut buf, flate2::FlushCompress::None) + .compress( + &payload[bytes_in as usize..], + &mut buf, + flate2::FlushCompress::None, + ) .map_err(|err| { self.reset(); ProtocolError::Io(err.into())