From d70407d4ca9b86f8093db4662da5ed656c391fd7 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Sat, 8 Nov 2025 21:26:56 +0100 Subject: [PATCH 1/5] `fn ZDICT_getDictHeaderSize`: test --- lib/dictBuilder/zdict.rs | 16 ++++++++++++++++ test-libzstd-rs-sys/test-data/test-dict.dat | Bin 0 -> 576 bytes 2 files changed, 16 insertions(+) create mode 100644 test-libzstd-rs-sys/test-data/test-dict.dat diff --git a/lib/dictBuilder/zdict.rs b/lib/dictBuilder/zdict.rs index 12ad311b..3c96849b 100644 --- a/lib/dictBuilder/zdict.rs +++ b/lib/dictBuilder/zdict.rs @@ -1631,3 +1631,19 @@ pub unsafe extern "C" fn ZDICT_addEntropyTablesFromBuffer( params, ) } + +#[cfg(test)] +mod test { + use super::*; + + const DICT: &[u8] = include_bytes!("../../test-libzstd-rs-sys/test-data/test-dict.dat"); + + #[test] + fn test_get_dict_header_size() { + let code = unsafe { ZDICT_getDictHeaderSize(DICT.as_ptr().cast(), DICT.len()) }; + match Error::from_error_code(code) { + Some(err) => panic!("{:?}", err), + None => assert_eq!(code, 133), + } + } +} diff --git a/test-libzstd-rs-sys/test-data/test-dict.dat b/test-libzstd-rs-sys/test-data/test-dict.dat new file mode 100644 index 0000000000000000000000000000000000000000..cbff1eed2d72a8e447d0e55971b72f8c3b929394 GIT binary patch literal 576 zcmcgoy-EW?5H=9RB498UmV*Q_5Fwp~l_5eDk%&Hko4d)~n!Vl2?%q!hLB+<>sEu7f z^B`jD6WG{^MIORAQP9HHVTT=dX1||Ve`rkKuHIF-Tz;LQIJ;w&{>$@e;eI^stgcjU z_VyRIYLod}*lhlY)_0v3JIkYXYhl!?j<&C>`Ke7#ikIiV;_;}lRGPh@tMt?;InzRc z$cmJ6l!rdTAmUCRx>_X?dMbtEC zK*4Q?5lk?IE@33x`q1Ms($5Sf2tJ6ECTPzzHTQfAF;7vNPqK}CXh__NATfk;5c*uE zpnA|1IVe49o7HL9^)RQ1Rnk@oXqGA6rHQp%bFQPOm1n?V#E3BpFg%5jxX}e~7)WNU z`P;Hj!t$;WgiQvmKyWlmgn>x9U+X}L+C$47VzIkQV*orfQ9vF9IW*kD|7_|5^4rh( literal 0 HcmV?d00001 From b42d7bfc62895452bb8f90835191dfccbf3ed3cd Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Sat, 8 Nov 2025 21:45:49 +0100 Subject: [PATCH 2/5] `fn ZDICT_getDictHeaderSize`: cleanup --- lib/dictBuilder/zdict.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/dictBuilder/zdict.rs b/lib/dictBuilder/zdict.rs index 3c96849b..6d1d31a2 100644 --- a/lib/dictBuilder/zdict.rs +++ b/lib/dictBuilder/zdict.rs @@ -98,22 +98,22 @@ pub unsafe extern "C" fn ZDICT_getDictHeaderSize( dictBuffer: *const core::ffi::c_void, dictSize: size_t, ) -> size_t { - let mut headerSize: size_t = 0; if dictSize <= 8 || MEM_readLE32(dictBuffer) != ZSTD_MAGIC_DICTIONARY { return Error::dictionary_corrupted.to_error_code(); } - let bs = malloc(::core::mem::size_of::()) - as *mut ZSTD_compressedBlockState_t; - let wksp = malloc(HUF_WORKSPACE_SIZE as size_t) as *mut u32; - if bs.is_null() || wksp.is_null() { - headerSize = Error::memory_allocation.to_error_code(); - } else { - ZSTD_reset_compressedBlockState(bs); - headerSize = ZSTD_loadCEntropy(bs, wksp as *mut core::ffi::c_void, dictBuffer, dictSize); - } - free(bs as *mut core::ffi::c_void); - free(wksp as *mut core::ffi::c_void); - headerSize + + // FIXME: in 1.92 we can use https://doc.rust-lang.org/std/boxed/struct.Box.html#method.new_zeroed + let mut bs = Box::::new_uninit(); + unsafe { ZSTD_reset_compressedBlockState(bs.as_mut_ptr()) }; + + let mut wksp = Box::<[u32]>::new_uninit_slice(HUF_WORKSPACE_SIZE as size_t / 4); + + ZSTD_loadCEntropy( + bs.as_mut_ptr(), + wksp.as_mut_ptr() as *mut core::ffi::c_void, + dictBuffer, + dictSize, + ) } unsafe fn ZDICT_count( From aa00a8da4d14999f8cae54cde44b99d817837f06 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Sat, 8 Nov 2025 21:51:13 +0100 Subject: [PATCH 3/5] `fn ZDICT_getDictID`: test --- lib/dictBuilder/zdict.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/dictBuilder/zdict.rs b/lib/dictBuilder/zdict.rs index 6d1d31a2..a4f22384 100644 --- a/lib/dictBuilder/zdict.rs +++ b/lib/dictBuilder/zdict.rs @@ -1640,10 +1640,38 @@ mod test { #[test] fn test_get_dict_header_size() { + let empty: &[u8] = &[]; + let code = unsafe { ZDICT_getDictHeaderSize(empty.as_ptr().cast(), empty.len()) }; + assert_eq!( + Error::from_error_code(code), + Some(Error::dictionary_corrupted) + ); + + let no_magic: &[u8] = &[0; 8]; + let code = unsafe { ZDICT_getDictHeaderSize(no_magic.as_ptr().cast(), no_magic.len()) }; + assert_eq!( + Error::from_error_code(code), + Some(Error::dictionary_corrupted) + ); + let code = unsafe { ZDICT_getDictHeaderSize(DICT.as_ptr().cast(), DICT.len()) }; match Error::from_error_code(code) { Some(err) => panic!("{:?}", err), None => assert_eq!(code, 133), } } + + #[test] + fn test_get_dict_id() { + let empty: &[u8] = &[]; + let code = unsafe { ZDICT_getDictID(empty.as_ptr().cast(), empty.len()) }; + assert_eq!(code, 0); + + let no_magic: &[u8] = &[0; 8]; + let code = unsafe { ZDICT_getDictID(no_magic.as_ptr().cast(), no_magic.len()) }; + assert_eq!(code, 0); + + let code = unsafe { ZDICT_getDictID(DICT.as_ptr().cast(), DICT.len()) }; + assert_eq!(code, 1877512422); + } } From 3717eccc5ee874be8ea4c79ad4dce4c70a74893c Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Sat, 8 Nov 2025 21:56:46 +0100 Subject: [PATCH 4/5] cleanup --- lib/dictBuilder/zdict.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/dictBuilder/zdict.rs b/lib/dictBuilder/zdict.rs index a4f22384..e45887db 100644 --- a/lib/dictBuilder/zdict.rs +++ b/lib/dictBuilder/zdict.rs @@ -90,7 +90,7 @@ pub unsafe extern "C" fn ZDICT_getDictID( if MEM_readLE32(dictBuffer) != ZSTD_MAGIC_DICTIONARY { return 0; } - MEM_readLE32((dictBuffer as *const core::ffi::c_char).add(4) as *const core::ffi::c_void) + MEM_readLE32(dictBuffer.byte_add(4)) } #[cfg_attr(feature = "export-symbols", export_name = crate::prefix!(ZDICT_getDictHeaderSize))] @@ -142,6 +142,7 @@ unsafe fn ZDICT_initDictItem(d: *mut dictItem) { (*d).length = 0; (*d).savings = -(1 as core::ffi::c_int) as u32; } + const LLIMIT: core::ffi::c_int = 64; const MINMATCHLENGTH: core::ffi::c_int = 7; unsafe fn ZDICT_analyzePos( From 99ae9ffe50d57837f6efec884e1b14363468dba3 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Sat, 8 Nov 2025 22:01:54 +0100 Subject: [PATCH 5/5] `fn ZDICT_fillNoise`: test --- lib/dictBuilder/zdict.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/dictBuilder/zdict.rs b/lib/dictBuilder/zdict.rs index e45887db..e38db8be 100644 --- a/lib/dictBuilder/zdict.rs +++ b/lib/dictBuilder/zdict.rs @@ -716,15 +716,15 @@ unsafe fn ZDICT_trainBuffer_legacy( result } -fn ZDICT_fillNoise(buffer: &mut [u8]) { +fn fill_noise(buffer: &mut [u8]) { const prime1: u32 = 2654435761; const prime2: u32 = 2246822519; let mut acc = prime1; - for e in buffer.iter_mut() { + for v in buffer.iter_mut() { acc = acc.wrapping_mul(prime2); - *e = (acc >> 21) as u8; + *v = (acc >> 21) as u8; } } @@ -1576,7 +1576,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_legacy( } let mut new_buf = vec![0u8; sBuffSize.wrapping_add(NOISELENGTH as size_t)]; core::ptr::copy_nonoverlapping(samplesBuffer.cast::(), new_buf.as_mut_ptr(), sBuffSize); - ZDICT_fillNoise(&mut new_buf[sBuffSize..]); + fill_noise(&mut new_buf[sBuffSize..]); ZDICT_trainFromBuffer_unsafe_legacy( dictBuffer, dictBufferCapacity, @@ -1675,4 +1675,14 @@ mod test { let code = unsafe { ZDICT_getDictID(DICT.as_ptr().cast(), DICT.len()) }; assert_eq!(code, 1877512422); } + + #[test] + fn test_fill_noise() { + let mut buf = vec![0u8; 16]; + fill_noise(&mut buf); + assert_eq!( + buf, + [226, 51, 247, 105, 221, 225, 137, 112, 5, 188, 15, 79, 183, 243, 110, 209] + ); + } }