Преглед изворни кода

nsd/ssl: Fix Resolve/ResolveEx and stub GetConnectionCount (#2208)

Ac_K пре 5 година
родитељ
комит
9575a7638a

+ 18 - 3
Ryujinx.HLE/HOS/Services/Sockets/Nsd/IManager.cs

@@ -1,4 +1,5 @@
 using Ryujinx.Common.Logging;
+using Ryujinx.Cpu;
 using Ryujinx.HLE.Exceptions;
 using Ryujinx.HLE.HOS.Services.Settings;
 using Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager;
@@ -135,9 +136,16 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
             long outputPosition = context.Request.ReceiveBuff[0].Position;
             long outputSize     = context.Request.ReceiveBuff[0].Size;
 
-            ResultCode result = _fqdnResolver.ResolveEx(context, out ResultCode errorCode, out string resolvedAddress);
+            ResultCode result = _fqdnResolver.ResolveEx(context, out _, out string resolvedAddress);
+
+            if (resolvedAddress.Length > outputSize)
+            {
+                return ResultCode.InvalidArgument;
+            }
+
+            byte[] resolvedAddressBuffer = Encoding.UTF8.GetBytes(resolvedAddress);
 
-            byte[] resolvedAddressBuffer = Encoding.UTF8.GetBytes(resolvedAddress + '\0');
+            MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
 
             context.Memory.Write((ulong)outputPosition, resolvedAddressBuffer);
 
@@ -153,7 +161,14 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
 
             ResultCode result = _fqdnResolver.ResolveEx(context, out ResultCode errorCode, out string resolvedAddress);
 
-            byte[] resolvedAddressBuffer = Encoding.UTF8.GetBytes(resolvedAddress + '\0');
+            if (resolvedAddress.Length > outputSize)
+            {
+                return ResultCode.InvalidArgument;
+            }
+
+            byte[] resolvedAddressBuffer = Encoding.UTF8.GetBytes(resolvedAddress);
+
+            MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
 
             context.Memory.Write((ulong)outputPosition, resolvedAddressBuffer);
 

+ 1 - 1
Ryujinx.HLE/HOS/Services/Sockets/Nsd/Manager/FqdnResolver.cs

@@ -104,7 +104,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager
 
             context.Memory.Read((ulong)inputPosition, addressBuffer);
 
-            string address = Encoding.UTF8.GetString(addressBuffer);
+            string address = Encoding.UTF8.GetString(addressBuffer).TrimEnd('\0');
 
             resultCode = Resolve(context, address, out resolvedAddress);
 

+ 6 - 1
Ryujinx.HLE/HOS/Services/Ssl/SslService/ISslConnection.cs

@@ -78,7 +78,12 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
             long inputDataPosition = context.Request.SendBuff[0].Position;
             long inputDataSize     = context.Request.SendBuff[0].Size;
 
-            uint transferredSize = 0;
+            byte[] data = new byte[inputDataSize];
+
+            context.Memory.Read((ulong)inputDataPosition, data);
+
+            // NOTE: Tell the guest everything is transferred.
+            uint transferredSize = (uint)inputDataSize;
 
             context.ResponseData.Write(transferredSize);
 

+ 15 - 0
Ryujinx.HLE/HOS/Services/Ssl/SslService/ISslContext.cs

@@ -6,6 +6,8 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
 {
     class ISslContext : IpcService
     {
+        private uint _connectionCount;
+
         private ulong _serverCertificateId;
         private ulong _clientCertificateId;
 
@@ -17,6 +19,19 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
         {
             MakeObject(context, new ISslConnection());
 
+            _connectionCount++;
+
+            return ResultCode.Success;
+        }
+
+        [CommandHipc(3)]
+        // GetConnectionCount() -> u32 count
+        public ResultCode GetConnectionCount(ServiceCtx context)
+        {
+            context.ResponseData.Write(_connectionCount);
+
+            Logger.Stub?.PrintStub(LogClass.ServiceSsl, new { _connectionCount });
+
             return ResultCode.Success;
         }