From be1c809b9f2c0d919bacbb9eaa4665e800b95fc7 Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Wed, 8 Apr 2026 17:52:36 +0300 Subject: [PATCH] Fix zstd compression (#15) --- nod/src/util/compress.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/nod/src/util/compress.rs b/nod/src/util/compress.rs index c871b33..e07a4b9 100644 --- a/nod/src/util/compress.rs +++ b/nod/src/util/compress.rs @@ -423,6 +423,8 @@ pub(crate) mod zstd_api { use super::{CStr, zstd_raw}; + const ZSTD_ERROR_DST_SIZE_TOO_SMALL: usize = 70usize.wrapping_neg(); + pub fn compress_bound(size: usize) -> usize { unsafe { zstd_raw::ZSTD_compressBound(size) } } fn map_error_code(code: usize) -> io::Error { @@ -448,9 +450,6 @@ pub(crate) mod zstd_api { } pub fn compress(buf: &[u8], level: i8, out: &mut Vec) -> io::Result { - if out.capacity() < compress_bound(buf.len()) { - return Ok(false); - } out.resize(out.capacity(), 0); let code = unsafe { zstd_raw::ZSTD_compress( @@ -462,6 +461,11 @@ pub(crate) mod zstd_api { ) }; if unsafe { zstd_raw::ZSTD_isError(code) } != 0 { + // dstSize_tooSmall means compressed data doesn't fit; signal caller to store uncompressed + if code == ZSTD_ERROR_DST_SIZE_TOO_SMALL { + out.clear(); + return Ok(false); + } return Err(map_error_code(code)); } out.truncate(code);