From fae1f4acd3eff5e58746b4c76dbaba677465de4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 30 Jan 2024 19:15:19 +0100 Subject: [PATCH] A null check and a locking simplification --- Core/ELF/ElfReader.cpp | 20 +++++++++++--------- Core/HW/Display.cpp | 10 +++++----- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Core/ELF/ElfReader.cpp b/Core/ELF/ElfReader.cpp index dcba8b789a..2eec38aa86 100644 --- a/Core/ELF/ElfReader.cpp +++ b/Core/ELF/ElfReader.cpp @@ -533,17 +533,19 @@ int ElfReader::LoadInto(u32 loadAddress, bool fromTop) u32 srcSize = p->p_filesz; u32 dstSize = p->p_memsz; u8 *dst = Memory::GetPointerWriteRange(writeAddr, dstSize); + if (dst) { + if (srcSize < dstSize) { + memset(dst + srcSize, 0, dstSize - srcSize); //zero out bss + NotifyMemInfo(MemBlockFlags::WRITE, writeAddr + srcSize, dstSize - srcSize, "ELFZero"); + } - if (srcSize < dstSize) - { - memset(dst + srcSize, 0, dstSize - srcSize); //zero out bss - NotifyMemInfo(MemBlockFlags::WRITE, writeAddr + srcSize, dstSize - srcSize, "ELFZero"); + memcpy(dst, src, srcSize); + std::string tag = StringFromFormat("ELFLoad/%08x", writeAddr); + NotifyMemInfo(MemBlockFlags::WRITE, writeAddr, srcSize, tag.c_str(), tag.size()); + DEBUG_LOG(LOADER, "Loadable Segment Copied to %08x, size %08x", writeAddr, (u32)p->p_memsz); + } else { + ERROR_LOG(LOADER, "Bad ELF segment. Trying to write %d bytes to %08x", dstSize, writeAddr); } - - memcpy(dst, src, srcSize); - std::string tag = StringFromFormat("ELFLoad/%08x", writeAddr); - NotifyMemInfo(MemBlockFlags::WRITE, writeAddr, srcSize, tag.c_str(), tag.size()); - DEBUG_LOG(LOADER,"Loadable Segment Copied to %08x, size %08x", writeAddr, (u32)p->p_memsz); } } memblock.ListBlocks(); diff --git a/Core/HW/Display.cpp b/Core/HW/Display.cpp index 1831ee3f23..0759d8a9ee 100644 --- a/Core/HW/Display.cpp +++ b/Core/HW/Display.cpp @@ -243,12 +243,12 @@ void DisplayFireVblankStart() { } void DisplayFireVblankEnd() { - std::vector toCall = [] { - std::lock_guard guard(listenersLock); - return vblankListeners; - }(); - isVblank = 0; + std::vector toCall; + { + std::lock_guard guard(listenersLock); + toCall = vblankListeners; + } for (VblankCallback cb : toCall) { cb();