diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-11-16 17:52:21 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-16 17:52:21 -0300 |
commit | 82a638230e4b10c099d8517b8ef7b602f22a6887 (patch) | |
tree | a28de2d911b5d9f5c51b6ccf065dbfdd8859781e /src | |
parent | d11fe26aa319b352112c434167e5c43f7b6ee636 (diff) |
Fix JitCache.Unmap called with the same address freeing memory in use (#5937)1.1.1089
Diffstat (limited to 'src')
-rw-r--r-- | src/ARMeilleure/Translation/Cache/JitCache.cs | 30 | ||||
-rw-r--r-- | src/ARMeilleure/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 91a05412..e2b5e2d1 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 91fd19c2..3957a755 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. } |