in safetensors/src/tensor.rs [587:624]
fn validate(&self) -> Result<usize, SafeTensorError> {
let mut start = 0;
for (i, info) in self.tensors.iter().enumerate() {
let (s, e) = info.data_offsets;
if s != start || e < s {
let tensor_name = self
.index_map
.iter()
.find_map(|(name, &index)| if index == i { Some(&name[..]) } else { None })
.unwrap_or("no_tensor");
return Err(SafeTensorError::InvalidOffset(tensor_name.to_string()));
}
start = e;
let nelements: usize = info
.shape
.iter()
.copied()
.try_fold(1usize, usize::checked_mul)
.ok_or(SafeTensorError::ValidationOverflow)?;
let nbits = nelements
.checked_mul(info.dtype.bitsize())
.ok_or(SafeTensorError::ValidationOverflow)?;
if nbits % 8 != 0 {
return Err(SafeTensorError::MisalignedSlice);
}
let size = nbits
.checked_div(8)
.ok_or(SafeTensorError::ValidationOverflow)?;
if e - s != size {
return Err(SafeTensorError::TensorInvalidInfo);
}
}
Ok(start)
}