use crate::Result;
pub(crate) const METADATA_MARKER: &[u8] = b"\xab\xcd\xefMaxMind.com";
pub(crate) const MAX_METADATA_SIZE: usize = 128 * 1024;
#[allow(clippy::unnecessary_lazy_evaluations)]
pub(crate) fn find_metadata_marker(data: &[u8]) -> Result<usize> {
let start = data.len().saturating_sub(MAX_METADATA_SIZE);
let window = &data[start..];
let rel = last_marker_in_window_dispatch(window).ok_or_else(|| {
crate::Error::InvalidMetadata("metadata marker not found in final 128 KiB")
})?;
Ok(start + rel)
}
#[inline]
pub(crate) fn last_marker_in_window(window: &[u8]) -> Option<usize> {
if window.len() < METADATA_MARKER.len() {
return None;
}
let valid_end = window.len() - METADATA_MARKER.len();
(0..=valid_end)
.rev()
.find(|&i| window[i] == METADATA_MARKER[0] && window[i..i + 14] == *METADATA_MARKER)
}
#[cfg(all(feature = "simd", any(target_arch = "x86_64", target_arch = "aarch64")))]
#[inline]
fn scalar_backward_range(window: &[u8], limit: usize, valid_end: usize) -> Option<usize> {
let mut p = limit.min(valid_end + 1);
while p > 0 {
p -= 1;
if window[p] == METADATA_MARKER[0] && window[p..p + 14] == *METADATA_MARKER {
return Some(p);
}
}
None
}
#[cfg(all(feature = "simd", target_arch = "x86_64"))]
pub(crate) fn last_marker_in_window_dispatch(window: &[u8]) -> Option<usize> {
if window.len() < METADATA_MARKER.len() {
return None;
}
unsafe { marker_sse2(window) }
}
#[cfg(all(feature = "simd", target_arch = "aarch64"))]
pub(crate) fn last_marker_in_window_dispatch(window: &[u8]) -> Option<usize> {
if window.len() < METADATA_MARKER.len() {
return None;
}
unsafe { marker_neon(window) }
}
#[cfg(any(
not(feature = "simd"),
all(
feature = "simd",
not(any(target_arch = "x86_64", target_arch = "aarch64"))
)
))]
pub(crate) fn last_marker_in_window_dispatch(window: &[u8]) -> Option<usize> {
last_marker_in_window(window)
}
#[cfg(all(feature = "simd", any(target_arch = "x86_64", target_arch = "aarch64")))]
#[inline(always)]
fn verify(window: &[u8], i: usize) -> bool {
window[i..i + METADATA_MARKER.len()] == *METADATA_MARKER
}
#[cfg(all(feature = "simd", any(target_arch = "x86_64", target_arch = "aarch64")))]
#[inline(always)]
fn best_candidate(window: &[u8], base: usize, valid_end: usize, mut mask: u32) -> Option<usize> {
while mask != 0 {
let bit = 31 - mask.leading_zeros() as usize;
mask &= !(1_u32 << bit);
let pos = base + bit;
if pos <= valid_end && verify(window, pos) {
return Some(pos);
}
}
None
}
#[cfg(all(feature = "simd", target_arch = "x86_64"))]
#[target_feature(enable = "sse2")]
pub(crate) unsafe fn marker_sse2(window: &[u8]) -> Option<usize> {
use std::arch::x86_64::{_mm_cmpeq_epi8, _mm_loadu_si128, _mm_movemask_epi8, _mm_set1_epi8};
if window.len() < METADATA_MARKER.len() {
return None;
}
let valid_end = window.len() - METADATA_MARKER.len();
if window.len() < 16 {
return last_marker_in_window(window);
}
let needle = _mm_set1_epi8(METADATA_MARKER[0] as i8);
let ptr = window.as_ptr();
let mut i = window.len() - 16;
loop {
let v = unsafe { _mm_loadu_si128(ptr.add(i).cast()) };
let mask = _mm_movemask_epi8(_mm_cmpeq_epi8(v, needle)) as u32;
if let Some(pos) = best_candidate(window, i, valid_end, mask) {
return Some(pos);
}
if i < 16 {
break;
}
i -= 16;
}
scalar_backward_range(window, i, valid_end)
}
#[cfg(all(feature = "simd", target_arch = "x86_64"))]
#[allow(dead_code)]
#[target_feature(enable = "avx2")]
pub(crate) unsafe fn marker_avx2(window: &[u8]) -> Option<usize> {
use std::arch::x86_64::{
_mm256_cmpeq_epi8, _mm256_loadu_si256, _mm256_movemask_epi8, _mm256_set1_epi8,
};
if window.len() < METADATA_MARKER.len() {
return None;
}
let valid_end = window.len() - METADATA_MARKER.len();
if window.len() < 32 {
return unsafe { marker_sse2(window) };
}
let needle = _mm256_set1_epi8(METADATA_MARKER[0] as i8);
let ptr = window.as_ptr();
let mut i = window.len() - 32;
loop {
let v = unsafe { _mm256_loadu_si256(ptr.add(i).cast()) };
let mask = _mm256_movemask_epi8(_mm256_cmpeq_epi8(v, needle)) as u32;
if let Some(pos) = best_candidate(window, i, valid_end, mask) {
return Some(pos);
}
if i < 32 {
break;
}
i -= 32;
}
scalar_backward_range(window, i, valid_end)
}
#[cfg(all(feature = "simd", target_arch = "x86_64"))]
#[allow(dead_code)]
#[target_feature(enable = "avx512f,avx512bw")]
pub(crate) unsafe fn marker_avx512(window: &[u8]) -> Option<usize> {
use std::arch::x86_64::{_mm512_cmpeq_epi8_mask, _mm512_loadu_si512, _mm512_set1_epi8};
if window.len() < METADATA_MARKER.len() {
return None;
}
let valid_end = window.len() - METADATA_MARKER.len();
if window.len() < 64 {
if std::arch::is_x86_feature_detected!("avx2") {
return unsafe { marker_avx2(window) };
}
return unsafe { marker_sse2(window) };
}
let needle = _mm512_set1_epi8(METADATA_MARKER[0] as i8);
let ptr = window.as_ptr();
let mut i = window.len() - 64;
loop {
let v = unsafe { _mm512_loadu_si512(ptr.add(i).cast()) };
let mut mask = _mm512_cmpeq_epi8_mask(v, needle);
while mask != 0 {
let bit = 63 - mask.leading_zeros() as usize;
mask &= !(1_u64 << bit);
let pos = i + bit;
if pos <= valid_end && verify(window, pos) {
return Some(pos);
}
}
if i < 64 {
break;
}
i -= 64;
}
scalar_backward_range(window, i, valid_end)
}
#[cfg(all(feature = "simd", target_arch = "aarch64"))]
#[target_feature(enable = "neon")]
pub(crate) unsafe fn marker_neon(window: &[u8]) -> Option<usize> {
use std::arch::aarch64::{vceqq_u8, vdupq_n_u8, vld1q_u8};
if window.len() < METADATA_MARKER.len() {
return None;
}
let valid_end = window.len() - METADATA_MARKER.len();
if window.len() < 16 {
return last_marker_in_window(window);
}
let needle = vdupq_n_u8(METADATA_MARKER[0]);
let ptr = window.as_ptr();
let mut i = window.len() - 16;
loop {
let v = unsafe { vld1q_u8(ptr.add(i)) };
let eq = vceqq_u8(v, needle);
let bytes: [u8; 16] = core::mem::transmute_copy(&eq);
for bit in (0..16).rev() {
if bytes[bit] != 0 {
let pos = i + bit;
if pos <= valid_end && verify(window, pos) {
return Some(pos);
}
}
}
if i < 16 {
break;
}
i -= 16;
}
scalar_backward_range(window, i, valid_end)
}
#[cfg(test)]
mod tests {
use super::*;
fn aligned_tail_check(data: &[u8]) {
let expected = last_marker_in_window(data);
let actual = last_marker_in_window_dispatch(data);
assert_eq!(actual, expected, "dispatch len {}", data.len());
#[cfg(all(feature = "simd", target_arch = "x86_64"))]
{
assert_eq!(
unsafe { marker_sse2(data) },
expected,
"sse2 len {}",
data.len()
);
if std::arch::is_x86_feature_detected!("avx2") {
assert_eq!(
unsafe { marker_avx2(data) },
expected,
"avx2 len {}",
data.len()
);
}
if std::arch::is_x86_feature_detected!("avx512f")
&& std::arch::is_x86_feature_detected!("avx512bw")
{
assert_eq!(
unsafe { marker_avx512(data) },
expected,
"avx512 len {}",
data.len()
);
}
}
}
#[test]
fn finds_marker_across_lengths_and_marker_positions() {
for marker_pos in 0..300 {
for garbage_len in [0_usize, 10, 14, 15, 16, 17, 64, 100] {
let mut data = vec![0x42; garbage_len];
let mut mark = Vec::new();
mark.extend_from_slice(METADATA_MARKER);
while mark.len() < marker_pos {
mark.push(0x43);
}
data.extend_from_slice(&mark);
assert_eq!(last_marker_in_window(&data), Some(garbage_len));
aligned_tail_check(&data);
}
}
}
#[test]
fn last_of_multiple_markers_wins() {
let mut data = Vec::new();
data.extend_from_slice(METADATA_MARKER);
data.extend_from_slice(&[0x42; 33]);
data.extend_from_slice(METADATA_MARKER);
data.extend_from_slice(&[0x42; 7]);
let expected = Some(47);
assert_eq!(last_marker_in_window(&data), expected);
aligned_tail_check(&data);
data.extend_from_slice(&[0x42; 5]);
assert_eq!(last_marker_in_window(&data), expected);
aligned_tail_check(&data);
}
#[test]
fn no_marker_returns_none() {
for len in [0_usize, 1, 13, 14, 15, 16, 31, 32, 63, 64, 100, 300] {
let data = vec![0x42; len];
assert_eq!(last_marker_in_window(&data), None);
aligned_tail_check(&data);
}
let mut data = vec![0x42; 40];
data[17] = METADATA_MARKER[0];
assert_eq!(last_marker_in_window(&data), None);
aligned_tail_check(&data);
}
#[test]
fn forged_first_byte_candidates_are_rejected() {
let mut data = vec![0x42; 700];
let mut rng = 0x1234_5678_u32;
for i in (0..data.len()).step_by(7) {
rng = rng.wrapping_mul(1664525).wrapping_add(1013904223);
data[i] = (rng >> 24) as u8;
}
data[650] = METADATA_MARKER[0];
data[650..650 + METADATA_MARKER.len()].copy_from_slice(METADATA_MARKER);
assert_eq!(last_marker_in_window(&data), Some(650));
aligned_tail_check(&data);
let mut tail = vec![0x42; 80];
tail[79] = METADATA_MARKER[0];
aligned_tail_check(&tail);
}
#[test]
fn oversized_window_behaviour_matches_scalar() {
let mut data = vec![0x55; 5000];
data.extend_from_slice(METADATA_MARKER);
data.extend_from_slice(&[0x33; 128]);
let window = data.as_slice();
let expected = Some(5000);
assert_eq!(last_marker_in_window(window), expected);
aligned_tail_check(window);
let window = &data[5000..];
assert_eq!(last_marker_in_window(window), Some(0));
aligned_tail_check(window);
let mut data2 = vec![0x55; 4096];
data2.extend_from_slice(METADATA_MARKER);
data2.extend_from_slice(&[0x33; 64]);
let window = &data2[..4096 + METADATA_MARKER.len()];
let expected = Some(4096);
assert_eq!(last_marker_in_window(window), expected);
aligned_tail_check(window);
}
#[test]
fn marker_in_sub_chunk_head_is_found() {
for chunk in [16_usize, 32, 64] {
let mut data = vec![0x42; chunk + 20];
data[2] = METADATA_MARKER[0];
data[2..2 + METADATA_MARKER.len()].copy_from_slice(METADATA_MARKER);
assert_eq!(last_marker_in_window(&data), Some(2), "chunk {chunk}");
aligned_tail_check(&data);
}
}
}