Просмотр исходного кода

Merge pull request #2327 from ReinUsesLisp/crash-safe-visit

gl_shader_decompiler: Return early when an operation is invalid
bunnei 7 лет назад
Родитель
Сommit
520e4e5d4b
1 измененных файлов с 6 добавлено и 1 удалено
  1. 6 1
      src/video_core/renderer_opengl/gl_shader_decompiler.cpp

+ 6 - 1
src/video_core/renderer_opengl/gl_shader_decompiler.cpp

@@ -426,9 +426,14 @@ private:
     std::string Visit(Node node) {
     std::string Visit(Node node) {
         if (const auto operation = std::get_if<OperationNode>(node)) {
         if (const auto operation = std::get_if<OperationNode>(node)) {
             const auto operation_index = static_cast<std::size_t>(operation->GetCode());
             const auto operation_index = static_cast<std::size_t>(operation->GetCode());
+            if (operation_index >= operation_decompilers.size()) {
+                UNREACHABLE_MSG("Out of bounds operation: {}", operation_index);
+                return {};
+            }
             const auto decompiler = operation_decompilers[operation_index];
             const auto decompiler = operation_decompilers[operation_index];
             if (decompiler == nullptr) {
             if (decompiler == nullptr) {
-                UNREACHABLE_MSG("Operation decompiler {} not defined", operation_index);
+                UNREACHABLE_MSG("Undefined operation: {}", operation_index);
+                return {};
             }
             }
             return (this->*decompiler)(*operation);
             return (this->*decompiler)(*operation);