From 942efbb6d69800e905e1f3f1309b40040bb9b789 Mon Sep 17 00:00:00 2001
From: Gabriel A <gab.dark.100@gmail.com>
Date: Thu, 4 Jan 2024 20:48:53 -0300
Subject: [PATCH] Fix potential race + wrong check for partition not being
 found

---
 .../Jit/AddressSpacePartitioned.cs            | 47 ++++++++++---------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs b/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs
index 7ef008690..d5ccb02a5 100644
--- a/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs
+++ b/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs
@@ -33,19 +33,22 @@ namespace Ryujinx.Cpu.Jit
 
             while (va < endVa)
             {
-                int partitionIndex = FindPartitionIndex(va);
-                AddressSpacePartition partition = _partitions[partitionIndex];
+                lock (_partitions)
+                {
+                    int partitionIndex = FindPartitionIndex(va);
+                    AddressSpacePartition partition = _partitions[partitionIndex];
 
-                (ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
+                    (ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
 
-                partition.Map(clampedVa, pa, clampedEndVa - clampedVa);
+                    partition.Map(clampedVa, pa, clampedEndVa - clampedVa);
 
-                ulong currentSize = clampedEndVa - clampedVa;
+                    ulong currentSize = clampedEndVa - clampedVa;
 
-                va += currentSize;
-                pa += currentSize;
+                    va += currentSize;
+                    pa += currentSize;
 
-                InsertBridgeIfNeeded(partitionIndex);
+                    InsertBridgeIfNeeded(partitionIndex);
+                }
             }
         }
 
@@ -55,27 +58,29 @@ namespace Ryujinx.Cpu.Jit
 
             while (va < endVa)
             {
-                int partitionIndex = FindPartitionIndex(va);
-                AddressSpacePartition partition = _partitions[partitionIndex];
+                AddressSpacePartition partition;
 
-                if (partition == null)
+                lock (_partitions)
                 {
-                    va += PartitionSize - (va & (PartitionSize - 1));
+                    int partitionIndex = FindPartitionIndex(va);
+                    if (partitionIndex < 0)
+                    {
+                        va += PartitionSize - (va & (PartitionSize - 1));
 
-                    continue;
-                }
+                        continue;
+                    }
 
-                (ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
+                    partition = _partitions[partitionIndex];
 
-                partition.Unmap(clampedVa, clampedEndVa - clampedVa);
+                    (ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
 
-                va += clampedEndVa - clampedVa;
+                    partition.Unmap(clampedVa, clampedEndVa - clampedVa);
 
-                RemoveBridgeIfNeeded(partitionIndex);
+                    va += clampedEndVa - clampedVa;
 
-                if (partition.IsEmpty())
-                {
-                    lock (_partitions)
+                    RemoveBridgeIfNeeded(partitionIndex);
+
+                    if (partition.IsEmpty())
                     {
                         _partitions.Remove(partition);
                         partition.Dispose();