All projects with patches now have outreach docs. 276 new docs covering CWE-407, CWE-312, CWE-362 across C, C++, Java, Python, Go, Rust, C#, PHP, Ruby, JavaScript, Dart, Erlang, R, and more. Outreach gap: 276 -> 0.
2.9 KiB
VICE — CWE-407 Disclosure Brief
2026-04-13 · Patch available — awaiting upstream merge
Finding
One O(n) defect in VICE emulator's breakpoint search. The sorted checkpoint list promises early exit but never implements it, causing full list traversal on every CPU cycle when breakpoints are active. Patched.
The Defects
vice-0001 (PATCHED — MEDIUM): src/monitor/mon_breakpoint.c
// In search_checkpoint_list() — fires per CPU opcode when MI_BREAK set:
while (cur_entry) {
// Comment says: "If the current entry is > than the search item,
// we can drop out early."
// But the early exit is never implemented!
if (mon_is_in_range(cur_entry->checkpt->start_addr,
cur_entry->checkpt->end_addr, loc)) {
return cur_entry;
}
cur_entry = cur_entry->next; // Always traverses entire list
}
The list is maintained in ascending start_addr order, but the early-exit optimization described in the comment was never coded. monitor_check_breakpoints fires per opcode from the CPU core macros whenever MI_BREAK is set (any breakpoint exists). At N=50 breakpoints and 1 MHz emulated CPU, this produces 50 million unnecessary comparisons per second.
Complexity Proof
vice-0001: At N=50 breakpoints:
- Defective: N comparisons per CPU cycle (full traversal)
- Fixed: ~log(N) effective average (early exit on sorted list)
- Eliminates ~90% of traversal for common case where PC is below the first breakpoint.
Impact
VICE is the most widely-used Commodore 64/128/VIC-20/PET/Plus4 emulator. Developers debugging 6502/Z80/65816 code set breakpoints for interactive sessions. With many breakpoints active, per-cycle overhead becomes measurable on slow hosts or during profiling of emulated code. The fix delivers the optimization the original code comments promised.
The Fix
vice-0001: Add the early-exit comparison before the range check:
// Before — traverses entire sorted list
while (cur_entry) {
if (mon_is_in_range(...)) return cur_entry;
cur_entry = cur_entry->next;
}
// After — exits early when past target address
while (cur_entry) {
if (addr_location(cur_entry->checkpt->start_addr) > loc_only)
break; // sorted list: no further entry can match
if (mon_is_in_range(...)) return cur_entry;
cur_entry = cur_entry->next;
}
Patch
Fix available: defects/vice-0001/patch/vice-0001-monitor-breakpoint-list-linear-scan.patch
Single-file patch in src/monitor/mon_breakpoint.c.
What We Ask
A patch is ready for review.
- Confirm receipt and assign an issue reference (VICE project tracker).
- Assess severity — fires per emulated CPU cycle when breakpoints are active.
- Coordinate a disclosure date — we are targeting 90 days from first contact.
- We will credit the VICE team in the public disclosure. Preferred acknowledgment format welcome.
Contact: see cover email. This brief is confidential until coordinated disclosure.