Fix potential issue with partial unmap
We must also do the unmap operation with the RWLock, otherwise faults on the unmapped region will cause crashes and the whole thing becomes pointless
This commit is contained in:
parent
35eb82cd94
commit
16a7da0314
1 changed files with 12 additions and 16 deletions
|
@ -293,18 +293,14 @@ namespace Ryujinx.Memory.WindowsShared
|
||||||
|
|
||||||
if (IsMapped(overlap.Value))
|
if (IsMapped(overlap.Value))
|
||||||
{
|
{
|
||||||
ulong overlapStart = overlap.Start;
|
|
||||||
ulong overlapEnd = overlap.End;
|
|
||||||
ulong overlapValue = overlap.Value;
|
|
||||||
|
|
||||||
lock (_mappings)
|
lock (_mappings)
|
||||||
{
|
{
|
||||||
_mappings.Remove(overlap);
|
_mappings.Remove(overlap);
|
||||||
_mappings.Add(new RangeNode<ulong>(overlapStart, overlapEnd, ulong.MaxValue));
|
_mappings.Add(new RangeNode<ulong>(overlap.Start, overlap.End, ulong.MaxValue));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool overlapStartsBefore = overlapStart < startAddress;
|
bool overlapStartsBefore = overlap.Start < startAddress;
|
||||||
bool overlapEndsAfter = overlapEnd > endAddress;
|
bool overlapEndsAfter = overlap.End > endAddress;
|
||||||
|
|
||||||
if (overlapStartsBefore || overlapEndsAfter)
|
if (overlapStartsBefore || overlapEndsAfter)
|
||||||
{
|
{
|
||||||
|
@ -321,25 +317,25 @@ namespace Ryujinx.Memory.WindowsShared
|
||||||
{
|
{
|
||||||
partialUnmapState.PartialUnmapsCount++;
|
partialUnmapState.PartialUnmapsCount++;
|
||||||
|
|
||||||
if (!WindowsApi.UnmapViewOfFile2(WindowsApi.CurrentProcessHandle, (IntPtr)overlapStart, 2))
|
if (!WindowsApi.UnmapViewOfFile2(WindowsApi.CurrentProcessHandle, (IntPtr)overlap.Start, 2))
|
||||||
{
|
{
|
||||||
throw new WindowsApiException("UnmapViewOfFile2");
|
throw new WindowsApiException("UnmapViewOfFile2");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlapStartsBefore)
|
if (overlapStartsBefore)
|
||||||
{
|
{
|
||||||
ulong remapSize = startAddress - overlapStart;
|
ulong remapSize = startAddress - overlap.Start;
|
||||||
|
|
||||||
MapViewInternal(sharedMemory, overlapValue, (IntPtr)overlapStart, (IntPtr)remapSize);
|
MapViewInternal(sharedMemory, overlap.Value, (IntPtr)overlap.Start, (IntPtr)remapSize);
|
||||||
RestoreRangeProtection(overlapStart, remapSize);
|
RestoreRangeProtection(overlap.Start, remapSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlapEndsAfter)
|
if (overlapEndsAfter)
|
||||||
{
|
{
|
||||||
ulong overlappedSize = endAddress - overlapStart;
|
ulong overlappedSize = endAddress - overlap.Start;
|
||||||
ulong remapBackingOffset = overlapValue + overlappedSize;
|
ulong remapBackingOffset = overlap.Value + overlappedSize;
|
||||||
ulong remapAddress = overlapStart + overlappedSize;
|
ulong remapAddress = overlap.Start + overlappedSize;
|
||||||
ulong remapSize = overlapEnd - endAddress;
|
ulong remapSize = overlap.End - endAddress;
|
||||||
|
|
||||||
MapViewInternal(sharedMemory, remapBackingOffset, (IntPtr)remapAddress, (IntPtr)remapSize);
|
MapViewInternal(sharedMemory, remapBackingOffset, (IntPtr)remapAddress, (IntPtr)remapSize);
|
||||||
RestoreRangeProtection(remapAddress, remapSize);
|
RestoreRangeProtection(remapAddress, remapSize);
|
||||||
|
@ -350,7 +346,7 @@ namespace Ryujinx.Memory.WindowsShared
|
||||||
partialUnmapLock.DowngradeFromWriterLock();
|
partialUnmapLock.DowngradeFromWriterLock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!WindowsApi.UnmapViewOfFile2(WindowsApi.CurrentProcessHandle, (IntPtr)overlapStart, 2))
|
else if (!WindowsApi.UnmapViewOfFile2(WindowsApi.CurrentProcessHandle, (IntPtr)overlap.Start, 2))
|
||||||
{
|
{
|
||||||
throw new WindowsApiException("UnmapViewOfFile2");
|
throw new WindowsApiException("UnmapViewOfFile2");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue