diff --git a/src/Deserialization.cpp b/src/Deserialization.cpp index f7f8566326db..7a76edc1193c 100644 --- a/src/Deserialization.cpp +++ b/src/Deserialization.cpp @@ -1446,6 +1446,13 @@ Pipeline Deserializer::deserialize(std::istream &in) { } Pipeline Deserializer::deserialize(const std::vector &data) { + // The accessors below chase offsets straight out of the buffer, so the + // buffer has to be structurally sound before we touch it. flatbuffers does + // not check that unless we ask; without this a malformed .hlpipe reads out + // of bounds (Finish() writes no file identifier, so verify without one). + flatbuffers::Verifier verifier(data.data(), data.size()); + user_assert(verifier.VerifyBuffer()) + << "malformed serialized pipeline: failed flatbuffer verification\n"; const auto *pipeline_obj = Serialize::GetPipeline(data.data()); if (pipeline_obj == nullptr) { user_warning << "deserialized pipeline is empty\n"; @@ -1573,6 +1580,9 @@ std::map Deserializer::deserialize_parameters(std::istre std::map Deserializer::deserialize_parameters(const std::vector &data) { std::map external_parameters_by_name; + flatbuffers::Verifier verifier(data.data(), data.size()); + user_assert(verifier.VerifyBuffer()) + << "malformed serialized pipeline: failed flatbuffer verification\n"; const auto *pipeline_obj = Serialize::GetPipeline(data.data()); if (pipeline_obj == nullptr) { user_warning << "deserialized pipeline is empty\n";