From fcb3d636b4fee9b6fb504f51d727941687b3ca9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 7 Jan 2025 23:12:40 +0100 Subject: [PATCH] Fix some closesocket bugs --- Core/HLE/sceNetInet.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceNetInet.cpp b/Core/HLE/sceNetInet.cpp index cee5d3a89c..481b78b2b6 100644 --- a/Core/HLE/sceNetInet.cpp +++ b/Core/HLE/sceNetInet.cpp @@ -798,10 +798,17 @@ static int sceNetInetClose(int socket) { return hleLogError(Log::sceNet, ERROR_INET_EBADF, "Bad socket #%d", socket); } - int retVal = closesocket(socket); + int retVal = closesocket(inetSock->sock); + if (retVal == 0) { + inetSock->sock = 0; + inetSock->state = SocketState::Unused; + } else { + ERROR_LOG(Log::sceNet, "closesocket(%d) failed (socket=%d)", inetSock->sock, socket); + } return hleLogSuccessI(Log::sceNet, retVal); } +// TODO: How is this different than just sceNetInetClose? static int sceNetInetCloseWithRST(int socket) { WARN_LOG(Log::sceNet, "UNTESTED %s(%i) at %08x", __FUNCTION__, socket, currentMIPS->pc); @@ -816,6 +823,12 @@ static int sceNetInetCloseWithRST(int socket) { sl.l_linger = 0; // timeout interval in seconds setsockopt(inetSock->sock, SOL_SOCKET, SO_LINGER, (const char*)&sl, sizeof(sl)); int retVal = closesocket(inetSock->sock); + if (retVal == 0) { + inetSock->sock = 0; + inetSock->state = SocketState::Unused; + } else { + ERROR_LOG(Log::sceNet, "closesocket(%d) failed (socket=%d)", inetSock->sock, socket); + } return hleLogSuccessI(Log::sceNet, retVal); }