From 82a638230e4b10c099d8517b8ef7b602f22a6887 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Thu, 16 Nov 2023 17:52:21 -0300 Subject: [PATCH] Fix JitCache.Unmap called with the same address freeing memory in use (#5937) --- src/ARMeilleure/Translation/Cache/JitCache.cs | 30 +++++-------------- .../Translation/Cache/JitUnwindWindows.cs | 2 +- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/ARMeilleure/Translation/Cache/JitCache.cs b/src/ARMeilleure/Translation/Cache/JitCache.cs index 91a054123..e2b5e2d10 100644 --- a/src/ARMeilleure/Translation/Cache/JitCache.cs +++ b/src/ARMeilleure/Translation/Cache/JitCache.cs @@ -117,12 +117,11 @@ namespace ARMeilleure.Translation.Cache int funcOffset = (int)(pointer.ToInt64() - _jitRegion.Pointer.ToInt64()); - bool result = TryFind(funcOffset, out CacheEntry entry); - Debug.Assert(result); - - _cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size)); - - Remove(funcOffset); + if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset) + { + _cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size)); + _cacheEntries.RemoveAt(entryIndex); + } } } @@ -181,22 +180,7 @@ namespace ARMeilleure.Translation.Cache _cacheEntries.Insert(index, entry); } - private static void Remove(int offset) - { - int index = _cacheEntries.BinarySearch(new CacheEntry(offset, 0, default)); - - if (index < 0) - { - index = ~index - 1; - } - - if (index >= 0) - { - _cacheEntries.RemoveAt(index); - } - } - - public static bool TryFind(int offset, out CacheEntry entry) + public static bool TryFind(int offset, out CacheEntry entry, out int entryIndex) { lock (_lock) { @@ -210,11 +194,13 @@ namespace ARMeilleure.Translation.Cache if (index >= 0) { entry = _cacheEntries[index]; + entryIndex = index; return true; } } entry = default; + entryIndex = 0; return false; } } diff --git a/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs b/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs index 91fd19c25..3957a7559 100644 --- a/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs +++ b/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs @@ -95,7 +95,7 @@ namespace ARMeilleure.Translation.Cache { int offset = (int)((long)controlPc - context.ToInt64()); - if (!JitCache.TryFind(offset, out CacheEntry funcEntry)) + if (!JitCache.TryFind(offset, out CacheEntry funcEntry, out _)) { return null; // Not found. }