mutex protection

This commit is contained in:
georgemoralis 2025-05-05 13:08:01 +03:00
parent ce33e32ede
commit 24b7d5cafb
3 changed files with 12 additions and 1 deletions

View File

@ -218,13 +218,13 @@ int PS4_SYSV_ABI posix_getsockname(Libraries::Net::OrbisNetId s,
} }
int returncode = sock->GetSocketAddress(addr, paddrlen); int returncode = sock->GetSocketAddress(addr, paddrlen);
if (returncode >= 0) { if (returncode >= 0) {
LOG_ERROR(Lib_Net, "return code : {:#x}", (u32)returncode);
return 0; return 0;
} }
*Libraries::Kernel::__Error() = 0x20; *Libraries::Kernel::__Error() = 0x20;
LOG_ERROR(Lib_Net, "error code returned : {:#x}", (u32)returncode); LOG_ERROR(Lib_Net, "error code returned : {:#x}", (u32)returncode);
return -1; return -1;
} }
void RegisterKernel(Core::Loader::SymbolsResolver* sym) { void RegisterKernel(Core::Loader::SymbolsResolver* sym) {
service_thread = std::jthread{KernelServiceThread}; service_thread = std::jthread{KernelServiceThread};

View File

@ -143,6 +143,7 @@ static void convertPosixSockaddrToOrbis(sockaddr* src, OrbisNetSockaddr* dst) {
} }
int PosixSocket::Close() { int PosixSocket::Close() {
std::scoped_lock lock{m_mutex};
#ifdef _WIN32 #ifdef _WIN32
auto out = closesocket(sock); auto out = closesocket(sock);
#else #else
@ -152,17 +153,20 @@ int PosixSocket::Close() {
} }
int PosixSocket::Bind(const OrbisNetSockaddr* addr, u32 addrlen) { int PosixSocket::Bind(const OrbisNetSockaddr* addr, u32 addrlen) {
std::scoped_lock lock{m_mutex};
sockaddr addr2; sockaddr addr2;
convertOrbisNetSockaddrToPosix(addr, &addr2); convertOrbisNetSockaddrToPosix(addr, &addr2);
return ConvertReturnErrorCode(::bind(sock, &addr2, sizeof(sockaddr_in))); return ConvertReturnErrorCode(::bind(sock, &addr2, sizeof(sockaddr_in)));
} }
int PosixSocket::Listen(int backlog) { int PosixSocket::Listen(int backlog) {
std::scoped_lock lock{m_mutex};
return ConvertReturnErrorCode(::listen(sock, backlog)); return ConvertReturnErrorCode(::listen(sock, backlog));
} }
int PosixSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, int PosixSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to,
u32 tolen) { u32 tolen) {
std::scoped_lock lock{m_mutex};
if (to != nullptr) { if (to != nullptr) {
sockaddr addr; sockaddr addr;
convertOrbisNetSockaddrToPosix(to, &addr); convertOrbisNetSockaddrToPosix(to, &addr);
@ -175,6 +179,7 @@ int PosixSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetS
int PosixSocket::ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr* from, int PosixSocket::ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr* from,
u32* fromlen) { u32* fromlen) {
std::scoped_lock lock{m_mutex};
if (from != nullptr) { if (from != nullptr) {
sockaddr addr; sockaddr addr;
int res = recvfrom(sock, (char*)buf, len, flags, &addr, (socklen_t*)fromlen); int res = recvfrom(sock, (char*)buf, len, flags, &addr, (socklen_t*)fromlen);
@ -187,6 +192,7 @@ int PosixSocket::ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr*
} }
SocketPtr PosixSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) { SocketPtr PosixSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) {
std::scoped_lock lock{m_mutex};
sockaddr addr2; sockaddr addr2;
net_socket new_socket = ::accept(sock, &addr2, (socklen_t*)addrlen); net_socket new_socket = ::accept(sock, &addr2, (socklen_t*)addrlen);
#ifdef _WIN32 #ifdef _WIN32
@ -202,12 +208,14 @@ SocketPtr PosixSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) {
} }
int PosixSocket::Connect(const OrbisNetSockaddr* addr, u32 namelen) { int PosixSocket::Connect(const OrbisNetSockaddr* addr, u32 namelen) {
std::scoped_lock lock{m_mutex};
sockaddr addr2; sockaddr addr2;
convertOrbisNetSockaddrToPosix(addr, &addr2); convertOrbisNetSockaddrToPosix(addr, &addr2);
return ::connect(sock, &addr2, sizeof(sockaddr_in)); return ::connect(sock, &addr2, sizeof(sockaddr_in));
} }
int PosixSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) { int PosixSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) {
std::scoped_lock lock{m_mutex};
sockaddr addr; sockaddr addr;
convertOrbisNetSockaddrToPosix(name, &addr); convertOrbisNetSockaddrToPosix(name, &addr);
if (name != nullptr) { if (name != nullptr) {
@ -234,6 +242,7 @@ int PosixSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) {
return 0 return 0
int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u32 optlen) { int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u32 optlen) {
std::scoped_lock lock{m_mutex};
level = ConvertLevels(level); level = ConvertLevels(level);
::linger native_linger; ::linger native_linger;
if (level == SOL_SOCKET) { if (level == SOL_SOCKET) {
@ -337,6 +346,7 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3
return 0; return 0;
int PosixSocket::GetSocketOptions(int level, int optname, void* optval, u32* optlen) { int PosixSocket::GetSocketOptions(int level, int optname, void* optval, u32* optlen) {
std::scoped_lock lock{m_mutex};
level = ConvertLevels(level); level = ConvertLevels(level);
if (level == SOL_SOCKET) { if (level == SOL_SOCKET) {
switch (optname) { switch (optname) {

View File

@ -51,6 +51,7 @@ struct Socket {
u32* fromlen) = 0; u32* fromlen) = 0;
virtual int Connect(const OrbisNetSockaddr* addr, u32 namelen) = 0; virtual int Connect(const OrbisNetSockaddr* addr, u32 namelen) = 0;
virtual int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) = 0; virtual int GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) = 0;
std::mutex m_mutex;
}; };
struct PosixSocket : public Socket { struct PosixSocket : public Socket {