mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-29 13:18:59 +02:00
[core/hle/services/sockets] allow 'valid' range from [16,255] for IPv4
Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
parent
5322bce4b8
commit
fce124a5bf
4 changed files with 10 additions and 13 deletions
|
|
@ -629,7 +629,7 @@ Errno BSD::BindImpl(s32 fd, std::span<const u8> addr) {
|
||||||
if (!IsFileDescriptorValid(fd)) {
|
if (!IsFileDescriptorValid(fd)) {
|
||||||
return Errno::BADF;
|
return Errno::BADF;
|
||||||
}
|
}
|
||||||
ASSERT(addr.size() == sizeof(SockAddrIn));
|
ASSERT(addr.size() >= 16);
|
||||||
auto addr_in = GetValue<SockAddrIn>(addr);
|
auto addr_in = GetValue<SockAddrIn>(addr);
|
||||||
|
|
||||||
return Translate(file_descriptors[fd]->socket->Bind(Translate(addr_in)));
|
return Translate(file_descriptors[fd]->socket->Bind(Translate(addr_in)));
|
||||||
|
|
@ -640,7 +640,7 @@ Errno BSD::ConnectImpl(s32 fd, std::span<const u8> addr) {
|
||||||
return Errno::BADF;
|
return Errno::BADF;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNIMPLEMENTED_IF(addr.size() != sizeof(SockAddrIn));
|
ASSERT(addr.size() >= 16);
|
||||||
auto addr_in = GetValue<SockAddrIn>(addr);
|
auto addr_in = GetValue<SockAddrIn>(addr);
|
||||||
|
|
||||||
const Errno result = Translate(file_descriptors[fd]->socket->Connect(Translate(addr_in)));
|
const Errno result = Translate(file_descriptors[fd]->socket->Connect(Translate(addr_in)));
|
||||||
|
|
@ -874,7 +874,7 @@ std::pair<s32, Errno> BSD::RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& mess
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
addr.clear();
|
addr.clear();
|
||||||
} else {
|
} else {
|
||||||
ASSERT(addr.size() == sizeof(SockAddrIn));
|
ASSERT(addr.size() >= 16);
|
||||||
const SockAddrIn result = Translate(addr_in);
|
const SockAddrIn result = Translate(addr_in);
|
||||||
PutValue(addr, result);
|
PutValue(addr, result);
|
||||||
}
|
}
|
||||||
|
|
@ -899,7 +899,7 @@ std::pair<s32, Errno> BSD::SendToImpl(s32 fd, u32 flags, std::span<const u8> mes
|
||||||
Network::SockAddrIn addr_in;
|
Network::SockAddrIn addr_in;
|
||||||
Network::SockAddrIn* p_addr_in = nullptr;
|
Network::SockAddrIn* p_addr_in = nullptr;
|
||||||
if (!addr.empty()) {
|
if (!addr.empty()) {
|
||||||
ASSERT(addr.size() == sizeof(SockAddrIn));
|
ASSERT(addr.size() >= 16);
|
||||||
auto guest_addr_in = GetValue<SockAddrIn>(addr);
|
auto guest_addr_in = GetValue<SockAddrIn>(addr);
|
||||||
addr_in = Translate(guest_addr_in);
|
addr_in = Translate(guest_addr_in);
|
||||||
p_addr_in = &addr_in;
|
p_addr_in = &addr_in;
|
||||||
|
|
|
||||||
|
|
@ -238,7 +238,7 @@ static std::vector<u8> SerializeAddrInfo(const std::vector<Network::AddrInfo>& v
|
||||||
Append<u32_be>(data, static_cast<u32>(Translate(addrinfo.family))); // ai_family
|
Append<u32_be>(data, static_cast<u32>(Translate(addrinfo.family))); // ai_family
|
||||||
Append<u32_be>(data, static_cast<u32>(Translate(addrinfo.socket_type))); // ai_socktype
|
Append<u32_be>(data, static_cast<u32>(Translate(addrinfo.socket_type))); // ai_socktype
|
||||||
Append<u32_be>(data, static_cast<u32>(Translate(addrinfo.protocol))); // ai_protocol
|
Append<u32_be>(data, static_cast<u32>(Translate(addrinfo.protocol))); // ai_protocol
|
||||||
Append<u32_be>(data, sizeof(SockAddrIn)); // ai_addrlen
|
Append<u32_be>(data, 16); // ai_addrlen
|
||||||
// ^ *not* sizeof(SerializedSockAddrIn), not that it matters since they're the same size
|
// ^ *not* sizeof(SerializedSockAddrIn), not that it matters since they're the same size
|
||||||
|
|
||||||
// ai_addr:
|
// ai_addr:
|
||||||
|
|
|
||||||
|
|
@ -110,8 +110,9 @@ struct SockAddrIn {
|
||||||
u8 family;
|
u8 family;
|
||||||
u16 portno;
|
u16 portno;
|
||||||
std::array<u8, 4> ip;
|
std::array<u8, 4> ip;
|
||||||
std::array<u8, 8> zeroes;
|
std::array<u8, 248> zeroes;
|
||||||
};
|
};
|
||||||
|
static_assert(sizeof(SockAddrIn) == 0x100);
|
||||||
|
|
||||||
enum class PollEvents : u16 {
|
enum class PollEvents : u16 {
|
||||||
// Using Pascal case because IN is a macro on Windows.
|
// Using Pascal case because IN is a macro on Windows.
|
||||||
|
|
|
||||||
|
|
@ -265,13 +265,9 @@ PollEvents Translate(Network::PollEvents flags) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Network::SockAddrIn Translate(SockAddrIn value) {
|
Network::SockAddrIn Translate(SockAddrIn value) {
|
||||||
if (value.len != 0 && value.len != sizeof(value) && value.len != 6) {
|
// All lengths are valid, from [0 upto 256]
|
||||||
LOG_WARNING(Service, "Unexpected SockAddrIn len={}, expected 0, {}, or 6",
|
|
||||||
value.len, sizeof(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
.family = Translate(static_cast<Domain>(value.family)),
|
.family = Translate(Domain(value.family)),
|
||||||
.ip = value.ip,
|
.ip = value.ip,
|
||||||
.portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
|
.portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
|
||||||
};
|
};
|
||||||
|
|
@ -279,7 +275,7 @@ Network::SockAddrIn Translate(SockAddrIn value) {
|
||||||
|
|
||||||
SockAddrIn Translate(Network::SockAddrIn value) {
|
SockAddrIn Translate(Network::SockAddrIn value) {
|
||||||
return {
|
return {
|
||||||
.len = sizeof(SockAddrIn),
|
.len = 16,
|
||||||
.family = static_cast<u8>(Translate(value.family)),
|
.family = static_cast<u8>(Translate(value.family)),
|
||||||
.portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
|
.portno = static_cast<u16>(value.portno >> 8 | value.portno << 8),
|
||||||
.ip = value.ip,
|
.ip = value.ip,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue