21 lines
1 KiB
Diff
21 lines
1 KiB
Diff
# UNDF: UNDF-2026-000000903
|
|
--- a/Core/MIPS/IR/IRJit.cpp
|
|
+++ b/Core/MIPS/IR/IRJit.cpp
|
|
@@ -363,4 +363,5 @@
|
|
for (u32 page = startPage; page <= endPage; ++page) {
|
|
- auto iter = std::find(byPage_[page].begin(), byPage_[page].end(), blockIndex);
|
|
+ auto& pageBlocks = byPage_[page];
|
|
+ auto iter = std::find(pageBlocks.begin(), pageBlocks.end(), blockIndex);
|
|
+ // TODO: Replace vector with unordered_set for O(1) removal
|
|
if (iter != byPage_[page].end()) {
|
|
byPage_[page].erase(iter);
|
|
#
|
|
# CWE-407: IRBlockCache::RemoveBlockFromPageLookup scans byPage_[page]
|
|
# vector with std::find for block removal — O(B) per page where B =
|
|
# blocks in that page. Called for every page spanned by the block being
|
|
# removed. When self-modifying code or icache flushes trigger frequent
|
|
# block invalidation, pages with many compiled blocks degrade.
|
|
# Fix: replace the vector<int> per page with an unordered_set<int> for
|
|
# O(1) membership test and removal.
|
|
# Severity: MEDIUM — JIT block invalidation is triggered by
|
|
# sceKernelIcacheClearAll and self-modifying code patterns.
|