HLE: Fix integer sign inconcistency accross the codebase (#2222)
* Make all title id instances unsigned * Replace address and size with ulong instead of signed types Long overdue change. Also change some logics here and there to optimize with the new memory manager. * Address Ac_K's comments * Remove uneeded cast all around * Fixes some others misalignment
This commit is contained in:
parent
c46f6879ff
commit
305f06eb71
73 changed files with 707 additions and 716 deletions
|
@ -24,8 +24,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
public ResultCode SetDnsAddressesPrivateRequest(ServiceCtx context)
|
||||
{
|
||||
uint cancelHandleRequest = context.RequestData.ReadUInt32();
|
||||
long bufferPosition = context.Request.SendBuff[0].Position;
|
||||
long bufferSize = context.Request.SendBuff[0].Size;
|
||||
ulong bufferPosition = context.Request.SendBuff[0].Position;
|
||||
ulong bufferSize = context.Request.SendBuff[0].Size;
|
||||
|
||||
// TODO: This is stubbed in 2.0.0+, reverse 1.0.0 version for the sake of completeness.
|
||||
Logger.Stub?.PrintStub(LogClass.ServiceSfdnsres, new { cancelHandleRequest });
|
||||
|
@ -38,8 +38,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
public ResultCode GetDnsAddressPrivateRequest(ServiceCtx context)
|
||||
{
|
||||
uint cancelHandleRequest = context.RequestData.ReadUInt32();
|
||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
|
||||
// TODO: This is stubbed in 2.0.0+, reverse 1.0.0 version for the sake of completeness.
|
||||
Logger.Stub?.PrintStub(LogClass.ServiceSfdnsres, new { cancelHandleRequest });
|
||||
|
@ -51,11 +51,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
// GetHostByNameRequest(u8, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>)
|
||||
public ResultCode GetHostByNameRequest(ServiceCtx context)
|
||||
{
|
||||
long inputBufferPosition = context.Request.SendBuff[0].Position;
|
||||
long inputBufferSize = context.Request.SendBuff[0].Size;
|
||||
ulong inputBufferPosition = context.Request.SendBuff[0].Position;
|
||||
ulong inputBufferSize = context.Request.SendBuff[0].Size;
|
||||
|
||||
long outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
long outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
ulong outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
ulong outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
|
||||
return GetHostByNameRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, 0, 0);
|
||||
}
|
||||
|
@ -64,11 +64,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
// GetHostByAddrRequest(u32, u32, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>)
|
||||
public ResultCode GetHostByAddrRequest(ServiceCtx context)
|
||||
{
|
||||
long inputBufferPosition = context.Request.SendBuff[0].Position;
|
||||
long inputBufferSize = context.Request.SendBuff[0].Size;
|
||||
ulong inputBufferPosition = context.Request.SendBuff[0].Position;
|
||||
ulong inputBufferSize = context.Request.SendBuff[0].Size;
|
||||
|
||||
long outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
long outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
ulong outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
ulong outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
|
||||
return GetHostByAddrRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, 0, 0);
|
||||
}
|
||||
|
@ -90,12 +90,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
_ => (errorCode <= NetDbError.Internal) ? "Resolver internal error" : "Unknown resolver error"
|
||||
};
|
||||
|
||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
|
||||
if (errorString.Length + 1 <= bufferSize)
|
||||
if ((ulong)(errorString.Length + 1) <= bufferSize)
|
||||
{
|
||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
||||
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
||||
|
||||
resultCode = ResultCode.Success;
|
||||
}
|
||||
|
@ -135,12 +135,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
_ => "Success"
|
||||
};
|
||||
|
||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
|
||||
if (errorString.Length + 1 <= bufferSize)
|
||||
if ((ulong)(errorString.Length + 1) <= bufferSize)
|
||||
{
|
||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
||||
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
||||
|
||||
resultCode = ResultCode.Success;
|
||||
}
|
||||
|
@ -152,8 +152,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
// GetAddrInfoRequest(bool enable_nsd_resolve, u32, u64 pid_placeholder, pid, buffer<i8, 5, 0> host, buffer<i8, 5, 0> service, buffer<packed_addrinfo, 5, 0> hints) -> (i32 ret, u32 bsd_errno, u32 packed_addrinfo_size, buffer<packed_addrinfo, 6, 0> response)
|
||||
public ResultCode GetAddrInfoRequest(ServiceCtx context)
|
||||
{
|
||||
long responseBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
long responseBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
ulong responseBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||
ulong responseBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||
|
||||
return GetAddrInfoRequestImpl(context, responseBufferPosition, responseBufferSize, 0, 0);
|
||||
}
|
||||
|
@ -188,9 +188,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
// GetHostByNameRequestWithOptions(u8, u32, u64, pid, buffer<unknown, 21, 0>, buffer<unknown, 21, 0>) -> (u32, u32, u32, buffer<unknown, 22, 0>)
|
||||
public ResultCode GetHostByNameRequestWithOptions(ServiceCtx context)
|
||||
{
|
||||
(long inputBufferPosition, long inputBufferSize) = context.Request.GetBufferType0x21();
|
||||
(long outputBufferPosition, long outputBufferSize) = context.Request.GetBufferType0x22();
|
||||
(long optionsBufferPosition, long optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||
(ulong inputBufferPosition, ulong inputBufferSize) = context.Request.GetBufferType0x21();
|
||||
(ulong outputBufferPosition, ulong outputBufferSize) = context.Request.GetBufferType0x22();
|
||||
(ulong optionsBufferPosition, ulong optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||
|
||||
return GetHostByNameRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, optionsBufferPosition, optionsBufferSize);
|
||||
}
|
||||
|
@ -199,9 +199,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
// GetHostByAddrRequestWithOptions(u32, u32, u32, u64, pid, buffer<unknown, 21, 0>, buffer<unknown, 21, 0>) -> (u32, u32, u32, buffer<unknown, 22, 0>)
|
||||
public ResultCode GetHostByAddrRequestWithOptions(ServiceCtx context)
|
||||
{
|
||||
(long inputBufferPosition, long inputBufferSize) = context.Request.GetBufferType0x21();
|
||||
(long outputBufferPosition, long outputBufferSize) = context.Request.GetBufferType0x22();
|
||||
(long optionsBufferPosition, long optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||
(ulong inputBufferPosition, ulong inputBufferSize) = context.Request.GetBufferType0x21();
|
||||
(ulong outputBufferPosition, ulong outputBufferSize) = context.Request.GetBufferType0x22();
|
||||
(ulong optionsBufferPosition, ulong optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||
|
||||
return GetHostByAddrRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, optionsBufferPosition, optionsBufferSize);
|
||||
}
|
||||
|
@ -210,17 +210,17 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
// GetAddrInfoRequestWithOptions(bool enable_nsd_resolve, u32, u64 pid_placeholder, pid, buffer<i8, 5, 0> host, buffer<i8, 5, 0> service, buffer<packed_addrinfo, 5, 0> hints, buffer<unknown, 21, 0>) -> (i32 ret, u32 bsd_errno, u32 unknown, u32 packed_addrinfo_size, buffer<packed_addrinfo, 22, 0> response)
|
||||
public ResultCode GetAddrInfoRequestWithOptions(ServiceCtx context)
|
||||
{
|
||||
(long responseBufferPosition, long responseBufferSize) = context.Request.GetBufferType0x22();
|
||||
(long optionsBufferPosition, long optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||
(ulong responseBufferPosition, ulong responseBufferSize) = context.Request.GetBufferType0x22();
|
||||
(ulong optionsBufferPosition, ulong optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||
|
||||
return GetAddrInfoRequestImpl(context, responseBufferPosition, responseBufferSize, optionsBufferPosition, optionsBufferSize);
|
||||
}
|
||||
|
||||
private ResultCode GetHostByNameRequestImpl(ServiceCtx context, long inputBufferPosition, long inputBufferSize, long outputBufferPosition, long outputBufferSize, long optionsBufferPosition, long optionsBufferSize)
|
||||
private ResultCode GetHostByNameRequestImpl(ServiceCtx context, ulong inputBufferPosition, ulong inputBufferSize, ulong outputBufferPosition, ulong outputBufferSize, ulong optionsBufferPosition, ulong optionsBufferSize)
|
||||
{
|
||||
byte[] rawName = new byte[inputBufferSize];
|
||||
|
||||
context.Memory.Read((ulong)inputBufferPosition, rawName);
|
||||
context.Memory.Read(inputBufferPosition, rawName);
|
||||
|
||||
string name = Encoding.ASCII.GetString(rawName).TrimEnd('\0');
|
||||
|
||||
|
@ -238,7 +238,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
|
||||
NetDbError netDbErrorCode = NetDbError.Success;
|
||||
GaiError errno = GaiError.Overflow;
|
||||
long serializedSize = 0;
|
||||
ulong serializedSize = 0;
|
||||
|
||||
if (name.Length <= byte.MaxValue)
|
||||
{
|
||||
|
@ -294,11 +294,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
private ResultCode GetHostByAddrRequestImpl(ServiceCtx context, long inputBufferPosition, long inputBufferSize, long outputBufferPosition, long outputBufferSize, long optionsBufferPosition, long optionsBufferSize)
|
||||
private ResultCode GetHostByAddrRequestImpl(ServiceCtx context, ulong inputBufferPosition, ulong inputBufferSize, ulong outputBufferPosition, ulong outputBufferSize, ulong optionsBufferPosition, ulong optionsBufferSize)
|
||||
{
|
||||
byte[] rawIp = new byte[inputBufferSize];
|
||||
|
||||
context.Memory.Read((ulong)inputBufferPosition, rawIp);
|
||||
context.Memory.Read(inputBufferPosition, rawIp);
|
||||
|
||||
// TODO: Use params.
|
||||
uint socketLength = context.RequestData.ReadUInt32();
|
||||
|
@ -315,7 +315,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
|
||||
NetDbError netDbErrorCode = NetDbError.Success;
|
||||
GaiError errno = GaiError.AddressFamily;
|
||||
long serializedSize = 0;
|
||||
ulong serializedSize = 0;
|
||||
|
||||
if (rawIp.Length == 4)
|
||||
{
|
||||
|
@ -349,59 +349,59 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
private long SerializeHostEntries(ServiceCtx context, long outputBufferPosition, long outputBufferSize, IPHostEntry hostEntry, IEnumerable<IPAddress> addresses = null)
|
||||
private ulong SerializeHostEntries(ServiceCtx context, ulong outputBufferPosition, ulong outputBufferSize, IPHostEntry hostEntry, IEnumerable<IPAddress> addresses = null)
|
||||
{
|
||||
long originalBufferPosition = outputBufferPosition;
|
||||
long bufferPosition = originalBufferPosition;
|
||||
ulong originalBufferPosition = outputBufferPosition;
|
||||
ulong bufferPosition = originalBufferPosition;
|
||||
|
||||
string hostName = hostEntry.HostName + '\0';
|
||||
|
||||
// h_name
|
||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(hostName));
|
||||
bufferPosition += hostName.Length;
|
||||
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(hostName));
|
||||
bufferPosition += (ulong)hostName.Length;
|
||||
|
||||
// h_aliases list size
|
||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness(hostEntry.Aliases.Length));
|
||||
bufferPosition += 4;
|
||||
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness(hostEntry.Aliases.Length));
|
||||
bufferPosition += sizeof(int);
|
||||
|
||||
// Actual aliases
|
||||
foreach (string alias in hostEntry.Aliases)
|
||||
{
|
||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(alias + '\0'));
|
||||
bufferPosition += alias.Length + 1;
|
||||
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(alias + '\0'));
|
||||
bufferPosition += (ulong)(alias.Length + 1);
|
||||
}
|
||||
|
||||
// h_addrtype but it's a short (also only support IPv4)
|
||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness((short)AddressFamily.InterNetwork));
|
||||
bufferPosition += 2;
|
||||
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness((short)AddressFamily.InterNetwork));
|
||||
bufferPosition += sizeof(short);
|
||||
|
||||
// h_length but it's a short
|
||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness((short)4));
|
||||
bufferPosition += 2;
|
||||
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness((short)4));
|
||||
bufferPosition += sizeof(short);
|
||||
|
||||
// Ip address count, we can only support ipv4 (blame Nintendo)
|
||||
context.Memory.Write((ulong)bufferPosition, addresses != null ? BinaryPrimitives.ReverseEndianness(addresses.Count()) : 0);
|
||||
bufferPosition += 4;
|
||||
context.Memory.Write(bufferPosition, addresses != null ? BinaryPrimitives.ReverseEndianness(addresses.Count()) : 0);
|
||||
bufferPosition += sizeof(int);
|
||||
|
||||
if (addresses != null)
|
||||
{
|
||||
foreach (IPAddress ip in addresses)
|
||||
{
|
||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness(BitConverter.ToInt32(ip.GetAddressBytes(), 0)));
|
||||
bufferPosition += 4;
|
||||
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness(BitConverter.ToInt32(ip.GetAddressBytes(), 0)));
|
||||
bufferPosition += sizeof(int);
|
||||
}
|
||||
}
|
||||
|
||||
return bufferPosition - originalBufferPosition;
|
||||
}
|
||||
|
||||
private ResultCode GetAddrInfoRequestImpl(ServiceCtx context, long responseBufferPosition, long responseBufferSize, long optionsBufferPosition, long optionsBufferSize)
|
||||
private ResultCode GetAddrInfoRequestImpl(ServiceCtx context, ulong responseBufferPosition, ulong responseBufferSize, ulong optionsBufferPosition, ulong optionsBufferSize)
|
||||
{
|
||||
bool enableNsdResolve = (context.RequestData.ReadInt32() & 1) != 0;
|
||||
uint cancelHandle = context.RequestData.ReadUInt32();
|
||||
|
||||
string host = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[0].Position, context.Request.SendBuff[0].Size);
|
||||
string service = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[1].Position, context.Request.SendBuff[1].Size);
|
||||
string host = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[0].Position, (long)context.Request.SendBuff[0].Size);
|
||||
string service = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[1].Position, (long)context.Request.SendBuff[1].Size);
|
||||
|
||||
// NOTE: We ignore hints for now.
|
||||
DeserializeAddrInfos(context.Memory, (ulong)context.Request.SendBuff[2].Position, (ulong)context.Request.SendBuff[2].Size);
|
||||
|
@ -500,7 +500,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
}
|
||||
}
|
||||
|
||||
private ulong SerializeAddrInfos(ServiceCtx context, long responseBufferPosition, long responseBufferSize, IPHostEntry hostEntry, int port)
|
||||
private ulong SerializeAddrInfos(ServiceCtx context, ulong responseBufferPosition, ulong responseBufferSize, IPHostEntry hostEntry, int port)
|
||||
{
|
||||
ulong originalBufferPosition = (ulong)responseBufferPosition;
|
||||
ulong bufferPosition = originalBufferPosition;
|
||||
|
@ -533,7 +533,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
|||
|
||||
// Termination zero value.
|
||||
context.Memory.Write(bufferPosition, 0);
|
||||
bufferPosition += 4;
|
||||
bufferPosition += sizeof(int);
|
||||
|
||||
return bufferPosition - originalBufferPosition;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue