Fix virtual memory allocation and access (#193)

* Fix virtual memory allocation and access

* Update test dependency lock file
This commit is contained in:
Spooks
2026-07-14 21:50:54 -06:00
committed by GitHub
parent 373100a6b0
commit 9d88542efd
9 changed files with 626 additions and 40 deletions
@@ -629,6 +629,7 @@ public static class KernelPthreadCompatExports
}
if (!InitializeMutexObject(ctx, handle, state))
{
TryFreeOpaqueObject(ctx, handle);
state.Semaphore.Dispose();
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -641,6 +642,7 @@ public static class KernelPthreadCompatExports
_mutexStates.TryRemove(mutexAddress, out _);
_mutexStates.TryRemove(handle, out _);
TryFreeOpaqueObject(ctx, handle);
state.Semaphore.Dispose();
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -668,6 +670,7 @@ public static class KernelPthreadCompatExports
}
_ = KernelMemoryCompatExports.TryWriteUInt64Compat(ctx, mutexAddress, 0);
TryFreeOpaqueObject(ctx, resolvedAddress);
state.Semaphore.Dispose();
return (int)OrbisGen2Result.ORBIS_GEN2_OK;
}
@@ -895,6 +898,7 @@ public static class KernelPthreadCompatExports
var initialState = new PthreadMutexAttrState(MutexTypeErrorCheck, 0);
if (!WriteMutexAttrObject(ctx, handle, initialState))
{
TryFreeOpaqueObject(ctx, handle);
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -912,6 +916,7 @@ public static class KernelPthreadCompatExports
_mutexAttrStates.Remove(handle);
}
TryFreeOpaqueObject(ctx, handle);
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -935,6 +940,7 @@ public static class KernelPthreadCompatExports
}
}
TryFreeOpaqueObject(ctx, resolvedAddress);
return (int)OrbisGen2Result.ORBIS_GEN2_OK;
}
@@ -1195,6 +1201,7 @@ public static class KernelPthreadCompatExports
{
if (_condStates.TryGetValue(condAddress, out var raced))
{
TryFreeOpaqueObject(ctx, handle);
resolvedAddress = condAddress;
state = raced;
return true;
@@ -1212,6 +1219,7 @@ public static class KernelPthreadCompatExports
_condStates.Remove(handle);
}
TryFreeOpaqueObject(ctx, handle);
return false;
}
@@ -1231,7 +1239,22 @@ public static class KernelPthreadCompatExports
Span<byte> initialData = stackalloc byte[size];
initialData.Clear();
return ctx.Memory.TryWrite(address, initialData);
if (ctx.Memory.TryWrite(address, initialData))
{
return true;
}
allocator.TryFreeGuestMemory(address);
address = 0;
return false;
}
private static void TryFreeOpaqueObject(CpuContext ctx, ulong address)
{
if (ctx.Memory is IGuestMemoryAllocator allocator)
{
allocator.TryFreeGuestMemory(address);
}
}
private static bool InitializeMutexObject(CpuContext ctx, ulong address, PthreadMutexState state) =>
@@ -1269,6 +1292,7 @@ public static class KernelPthreadCompatExports
_condStates.Remove(handle);
}
TryFreeOpaqueObject(ctx, handle);
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -1293,6 +1317,7 @@ public static class KernelPthreadCompatExports
}
_ = KernelMemoryCompatExports.TryWriteUInt64Compat(ctx, condAddress, 0);
TryFreeOpaqueObject(ctx, resolvedAddress);
return (int)OrbisGen2Result.ORBIS_GEN2_OK;
}
@@ -1775,6 +1800,7 @@ public static class KernelPthreadCompatExports
}
if (!InitializeMutexObject(ctx, handle, createdState))
{
TryFreeOpaqueObject(ctx, handle);
resolvedAddress = 0;
state = null;
return false;
@@ -1784,12 +1810,14 @@ public static class KernelPthreadCompatExports
{
if (_mutexStates.TryGetValue(mutexAddress, out state))
{
TryFreeOpaqueObject(ctx, handle);
resolvedAddress = mutexAddress;
return true;
}
if (_mutexStates.TryGetValue(handle, out state))
{
TryFreeOpaqueObject(ctx, handle);
resolvedAddress = handle;
return true;
}
@@ -1803,6 +1831,7 @@ public static class KernelPthreadCompatExports
_mutexStates.TryRemove(mutexAddress, out _);
_mutexStates.TryRemove(handle, out _);
TryFreeOpaqueObject(ctx, handle);
resolvedAddress = 0;
state = null;
return false;