Compare commits

..

2 Commits

Author SHA1 Message Date
GreemDev
13b69aedfe idea: Catch HorizonResultExceptions of result type ResultFsNonRealDataVerificationFailed
- log a more clear error message as to what 2002-4604 means for the user
- and return the result from the FileSystemProxy IStorage to pass the invalid data handling to the game instead of stopping emulation there and then.
  - this may be changed. i'm pretty sure this error is only thrown when you actually have integrity checking enabled in settings, so maybe it crashing with a friendler message is more desired than potentially continuing execution. we will see
2025-11-06 23:40:16 -06:00
GreemDev
234f7ca298 Fix socket closing on shutdown
Previously, sockets were only ever closed when the game specifically requested it.

Thanks @comex on GitHub for the patch submitted via the issues page.

Co-Authored-By: comex <47517+comex@users.noreply.github.com>
2025-11-04 20:48:36 -06:00
3 changed files with 46 additions and 7 deletions

View File

@@ -1,8 +1,10 @@
using LibHac;
using LibHac.Common;
using LibHac.Fs;
using LibHac.Sf;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Memory;
using System.Threading;
@@ -40,7 +42,19 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
}
using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true);
Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size);
Result result;
try
{
result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size);
}
catch (HorizonResultException hre) when (hre.IsOfResultType(ResultFs.NonRealDataVerificationFailed))
{
Logger.Error?.Print(LogClass.ServiceFs,
$"Encountered corrupted data in filesystem storage @ offset 0x{offset:X8}, size 0x{size:X8}. " +
"Please redump the current game and/or update from your console.");
result = ResultFs.NonRealDataVerificationFailed;
}
if (context.Device.DirtyHacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix) && IsXc2)
{

View File

@@ -7,7 +7,7 @@ using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
{
class BsdContext
class BsdContext : IDisposable
{
private static readonly ConcurrentDictionary<ulong, BsdContext> _registry = new();
@@ -158,6 +158,20 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
return LinuxError.SUCCESS;
}
public void Dispose()
{
int count;
lock (_lock)
{
count = _fds.Count;
}
for (int fd = 0; fd < count; fd++) {
CloseFileDescriptor(fd);
}
}
public static BsdContext GetOrRegister(ulong processId)
{
BsdContext context = GetContext(processId);
@@ -174,12 +188,15 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
public static BsdContext GetContext(ulong processId)
{
if (!_registry.TryGetValue(processId, out BsdContext processContext))
{
return null;
}
return _registry.GetValueOrDefault(processId);
}
return processContext;
public static void DeleteContext(ulong processId)
{
if (_registry.Remove(processId, out BsdContext context))
{
context.Dispose();
}
}
}
}

View File

@@ -1165,5 +1165,13 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
return WriteBsdResult(context, newSockFd, errno);
}
public override void DestroyAtExit()
{
if (_context != null) {
_context.Dispose();
}
}
}
}