From a25772dcb77e631f26be02c995af41379effa6aa Mon Sep 17 00:00:00 2001 From: Tim Hutt Date: Sun, 1 Jun 2025 17:46:06 +0100 Subject: [PATCH] Fix WASM chunk_count The loop condition was incorrect which meant it would read beyond the end of `haystack` and crash if it went beyond the end of memory. It would probably give incorrect counts too. --- src/simd/wasm.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/simd/wasm.rs b/src/simd/wasm.rs index 3351a2c..9495c47 100644 --- a/src/simd/wasm.rs +++ b/src/simd/wasm.rs @@ -16,6 +16,8 @@ unsafe fn u8x16_from_offset(slice: &[u8], offset: usize) -> v128 { v128_load(slice.as_ptr().add(offset) as *const _) } +// Load four 16-byte vectors from a slice at a given offset. +// This function assumes that the slice has at least 64 bytes available from the offset. #[target_feature(enable = "simd128")] unsafe fn u8x16x4_from_offset(slice: &[u8], offset: usize) -> (v128, v128, v128, v128) { debug_assert!( @@ -76,7 +78,7 @@ pub unsafe fn chunk_count(haystack: &[u8], needle: u8) -> usize { let mut count = 0; let mut offset = 0; - while haystack.len() >= offset + 16 * 255 { + while haystack.len() >= offset + 64 * 255 { let (mut count1, mut count2, mut count3, mut count4) = ( u8x16_splat(0), u8x16_splat(0),