Как проверить правильность использования Flatbuffer или правильно обработать ошибку? - PullRequest
0 голосов
/ 02 марта 2019

Я использую Rust и Flatbuffers для загрузки файлов.Когда я пытаюсь загрузить файл, который не является допустимым файлом flatbuffer, моя программа паникует с индексом вне диапазона.Как я могу показать ошибку пользователю без сбоев?

Маленький Пример:

file_content_as_u8 // This is my &[u8] where I have loaded the file content.
// &[u8] to fltabuffer where get_root_as_file is generated by flatbuffer
let file_content = get_root_as_file(file_content_as_u8);
// Try to read data field from flatbuffer
let data = file_content.data();
// If file_content_as_u8 wasn't a valid flatbuffer file file_content.data()
// results in a panic with an index out of range

1 Ответ

0 голосов
/ 02 марта 2019

Код для 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.

...