From ee7383193bcb67f1dcaafcf4c529bc177da40e87 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Tue, 21 Sep 2021 15:31:33 +0700 Subject: [PATCH] Fix race condition issue on AdhocMatching --- Core/HLE/proAdhoc.cpp | 10 ++-------- Core/HLE/sceNetAdhoc.cpp | 6 ++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 66f166d84a..24832d08d6 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -2252,7 +2252,7 @@ bool resolveIP(uint32_t ip, SceNetEtherAddr * mac) { } // Multithreading Lock - peerlock.lock(); + std::lock_guard peer_guard(peerlock); // Peer Reference SceNetAdhocctlPeerInfo * peer = friends; @@ -2264,17 +2264,11 @@ bool resolveIP(uint32_t ip, SceNetEtherAddr * mac) { // Copy Data *mac = peer->mac_addr; - // Multithreading Unlock - peerlock.unlock(); - // Return Success return true; } } - // Multithreading Unlock - peerlock.unlock(); - // Peer not found return false; } @@ -2293,7 +2287,7 @@ bool resolveMAC(SceNetEtherAddr * mac, uint32_t * ip) { } // Multithreading Lock - std::lock_guard guard(peerlock); + std::lock_guard peer_guard(peerlock); // Peer Reference SceNetAdhocctlPeerInfo * peer = friends; diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 2ef390c223..0fdb251b73 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -5390,6 +5390,9 @@ int sceNetAdhocMatchingSendData(int matchingId, const char *mac, int dataLen, u3 void* data = NULL; if (Memory::IsValidAddress(dataAddr)) data = Memory::GetPointer(dataAddr); + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Find Target Peer SceNetAdhocMatchingMemberInternal* peer = findPeer(context, (SceNetEtherAddr*)mac); @@ -7306,9 +7309,12 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi // FIXME: When using JPCSP + prx files, the "SceNetAdhocMatchingInput" thread is using blocking PdpRecv with infinite(0) timeout, which can be stopped/aborted using SetSocketAlert, while "SceNetAdhocMatchingEvent" thread is using non-blocking for sending rxbuflen = context->rxbuflen; senderport = 0; + // Lock the peer first before locking the socket to avoid race condiion + peerlock.lock(); context->socketlock->lock(); int recvresult = sceNetAdhocPdpRecv(context->socket, &sendermac, &senderport, context->rxbuf, &rxbuflen, 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); + peerlock.unlock(); // Received Data from a Sender that interests us // Note: There are cases where the sender port might be re-mapped by router or ISP, so we shouldn't check the source port.