mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-01 12:07:31 +01:00
HLE: Check more guest buffers by their full length, and an empty insert
Calls that checked one byte of a game's buffer and then wrote or read the whole thing, or trusted a negative length: - sceNetEtherNtostr/Strton, the apctl BSS descriptor calls, GetState and sceNetGetDropRate. - sceNpAuthGetTicket wrote its whole ticket whatever the length; it's now built locally and written once the buffer is known to hold it. sceNpAuthGetTicketParam checked its limits after copying, and walked ticket params past the ticket's end. - sceNp2's communication ID and passphrase, a negative maxServerIds, and an unchecked unknown1Ptr. - sceParseUri's work area and scheme string, sceParseHttp's negative header length and value address, and ReadVariableSizedStruct's size. - sceKernelCreateLwMutex initialized the work area without checking it at all, and the other LwMutex calls checked one byte of it. - sceNetAdhocctlGetScanInfo cleared the length the game gave, of a buffer checked by one byte (or any length, negative ones included). Also: a game mode join inserted at begin() + 1 into a possibly empty list of players. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c0e750726f
commit
0a778a13ff
9 files changed
+127
-67
No files matched your search
@@ -2744,15 +2744,15 @@ int sceNetAdhocctlScan(MIPSState *mips) {
|
||||
|
||||
int sceNetAdhocctlGetScanInfo(MIPSState *mips, u32 sizeAddr, u32 bufAddr) {
|
||||
s32_le *buflen = NULL;
|
||||
if (Memory::IsValidAddress(sizeAddr)) {
|
||||
buflen = (s32_le *)Memory::GetPointerOrException(sizeAddr);
|
||||
if (Memory::IsValid4AlignedAddress(sizeAddr)) {
|
||||
buflen = (s32_le *)Memory::GetPointerWriteUnchecked(sizeAddr);
|
||||
}
|
||||
SceNetAdhocctlScanInfoEmu *buf = NULL;
|
||||
if (Memory::IsValidAddress(bufAddr)) {
|
||||
buf = (SceNetAdhocctlScanInfoEmu *)Memory::GetPointerOrException(bufAddr);
|
||||
}
|
||||
|
||||
INFO_LOG(Log::sceNet, "sceNetAdhocctlGetScanInfo([%08x]=%i, %08x) at %08x", sizeAddr, Memory::ReadUnchecked_U32(sizeAddr), bufAddr, mips->pc);
|
||||
INFO_LOG(Log::sceNet, "sceNetAdhocctlGetScanInfo([%08x]=%i, %08x) at %08x", sizeAddr, buflen ? (int)*buflen : 0, bufAddr, mips->pc);
|
||||
if (!g_Config.bEnableWlan) {
|
||||
return hleLogWarning(Log::sceNet, 0, "WLAN off");
|
||||
}
|
||||
@@ -2783,14 +2783,17 @@ int sceNetAdhocctlGetScanInfo(MIPSState *mips, u32 sizeAddr, u32 bufAddr) {
|
||||
}
|
||||
// Normal Information Mode
|
||||
else {
|
||||
// Only touch the part of the buffer that's valid memory.
|
||||
const u32 validLen = Memory::ClampValidSizeAt(bufAddr, std::max((s32)*buflen, 0));
|
||||
|
||||
// Clear Memory
|
||||
memset(buf, 0, *buflen);
|
||||
memset(buf, 0, validLen);
|
||||
|
||||
// Network Discovery Counter
|
||||
int discovered = 0;
|
||||
|
||||
// Count requested Networks
|
||||
int requestcount = *buflen / sizeof(SceNetAdhocctlScanInfoEmu);
|
||||
int requestcount = validLen / sizeof(SceNetAdhocctlScanInfoEmu);
|
||||
|
||||
// Minimum Argument Requirements
|
||||
if (requestcount > 0) {
|
||||
|
||||
Reference in new issue
Block a user