From eea73bc421d359f0df60f377d2f921357a217416 Mon Sep 17 00:00:00 2001 From: gdk Date: Thu, 14 Nov 2019 15:29:32 -0300 Subject: [PATCH] Add missing check for BRX, do not add a out of bounds block to the queue --- Ryujinx.Graphics.Shader/Decoders/Decoder.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Ryujinx.Graphics.Shader/Decoders/Decoder.cs b/Ryujinx.Graphics.Shader/Decoders/Decoder.cs index 6841c98d..9f039b94 100644 --- a/Ryujinx.Graphics.Shader/Decoders/Decoder.cs +++ b/Ryujinx.Graphics.Shader/Decoders/Decoder.cs @@ -45,6 +45,8 @@ namespace Ryujinx.Graphics.Shader.Decoders GetBlock(0); + ulong maxAddress = (ulong)code.Length - headerSize; + while (workQueue.TryDequeue(out Block currBlock)) { // Check if the current block is inside another block. @@ -65,7 +67,7 @@ namespace Ryujinx.Graphics.Shader.Decoders } // If we have a block after the current one, set the limit address. - ulong limitAddress = (ulong)code.Length - headerSize; + ulong limitAddress = maxAddress; if (nBlkIndex != blocks.Count) { @@ -140,7 +142,7 @@ namespace Ryujinx.Graphics.Shader.Decoders } // Do we have a block after the current one? - if (!IsExit(currBlock.GetLastOp()) && currBlock.BrIndir != null) + if (!IsExit(currBlock.GetLastOp()) && currBlock.BrIndir != null && currBlock.EndAddress < maxAddress) { bool targetVisited = visited.ContainsKey(currBlock.EndAddress);