Код для get_root
:
#[inline]
pub fn get_root<'a, T: Follow<'a> + 'a>(data: &'a [u8]) -> T::Inner {
<ForwardsUOffset<T>>::follow(data, 0)
}
Реализация для Follow
для ForwardsUOffset
:
impl<'a, T: Follow<'a>> Follow<'a> for ForwardsUOffset<T> {
type Inner = T::Inner;
#[inline(always)]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
let slice = &buf[loc..loc + SIZE_UOFFSET];
let off = read_scalar::<u32>(slice) as usize;
T::follow(buf, loc + off)
}
}
Эта реализация не выполняет никакой проверки границ, интерпретирует первые 4 байта как смещение и просто вызывает follow
в той части буфера, на которую указывает смещение.Я не знаю, что означает T
в вашем контексте, но если файл меньше 4 байт, этот код будет паниковать с индексом вне диапазона.Если это не так, аналогичная ситуация может возникнуть в реализации T::follow
, так как нет проверки границ в любой из реализаций follow
, которые я видел, и follow
возвращает пустое значение, а не Result
.
У вас есть два варианта:
- Сообщайте об ошибке разработчикам Flatbuffers и заставляйте их лучше обрабатывать поврежденные файлы.
- Паникуйте самостоятельноиспользуя
std::panic::catch_unwind
.
Отказ от ответственности: я работаю в Google, но я не работаю ни с чем, связанным с Flatbuffers.