Skip to content

Commit

Permalink
Prevent memory leaks when clearing AdhocMatching events.
Browse files Browse the repository at this point in the history
  • Loading branch information
anr2me committed Oct 28, 2020
1 parent bff18c0 commit 22419bf
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions Core/HLE/sceNetAdhoc.cpp
Expand Up @@ -848,6 +848,19 @@ int WaitBlockingAdhocSocket(u64 threadSocketId, int type, int pspSocketId, void*
return ERROR_NET_ADHOC_TIMEOUT;
}

// Using matchingId = -1 to delete all matching events
void deleteMatchingEvents(const int matchingId = -1) {
for (auto it = matchingEvents.begin(); it != matchingEvents.end(); ) {
if (matchingId < 0 || it->data[0] == matchingId) {
if (Memory::IsValidAddress(it->data[2]))
userMemory.Free(it->data[2]);
it = matchingEvents.erase(it);
}
else
++it;
}
}

void netAdhocValidateLoopMemory() {
// Allocate Memory if it wasn't valid/allocated after loaded from old SaveState
if (!dummyThreadHackAddr || (dummyThreadHackAddr && strcmp("dummythreadhack", kernelMemory.GetBlockTag(dummyThreadHackAddr)) != 0)) {
Expand Down Expand Up @@ -950,11 +963,11 @@ void __NetAdhocDoState(PointerWrap &p) {
if (p.mode == p.MODE_READ) {
// Discard leftover events
adhocctlEvents.clear();
matchingEvents.clear();
adhocctlRequests.clear();
adhocSocketRequests.clear();
sendTargetPeers.clear();
deleteAllAdhocSockets();
deleteMatchingEvents();

// Let's not change "Inited" value when Loading SaveState to prevent memory & port leaks
netAdhocMatchingInited = cur_netAdhocMatchingInited;
Expand Down Expand Up @@ -4194,12 +4207,7 @@ int NetAdhocMatching_Delete(int matchingId) {
item = NULL;

// Making sure there are no leftover matching events from this session which could cause a crash on the next session
for (auto it = matchingEvents.begin(); it != matchingEvents.end(); ) {
if (it->data[0] == matchingId)
it = matchingEvents.erase(it);
else
++it;
}
deleteMatchingEvents(matchingId);

// Stop Search
break;
Expand Down Expand Up @@ -4238,7 +4246,7 @@ int sceNetAdhocMatchingInit(u32 memsize) {
fakePoolSize = memsize;

// Initialize Library
matchingEvents.clear();
deleteMatchingEvents();
netAdhocMatchingInited = true;

// Return Success
Expand Down

0 comments on commit 22419bf

Please sign in to comment.