Accept all four broadcaster names, and alias memory reads to uintValue

broadcast.config.set rejected "game" and "stepping" as unsupported, though both
are documented and both are real broadcasters. The valid keys are whatever
already exists in the client's disallowed map, and that map starts empty and
only grows as a side effect of operator[] the first time each category
broadcasts - so which keys were accepted depended on what had happened to fire
yet. "logger" and "input" work because the broadcast loop touches them every
lap; "game" and "stepping" only appear once one actually occurs. Seed all four
at connection setup. Unknown keys are still refused, which is the useful half
of the old behaviour.

The numeric memory reads answered with "value" while cpu.getReg and
cpu.getAllRegs answer with "uintValue". Nothing marks which is which, so a
client that guesses gets a missing key - and one that defaults a missing key to
zero silently reports plausible nonsense, which cost real time during the
CrossCraft investigation (an empty vtable that wasn't). Write both names.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9
This commit is contained in:
Henrik Rydgård
2026-08-18 09:32:04 +02:00
co-authored by Claude Opus 5
parent 28b3dd9da1
commit 6bcc376c06
3 changed files with 22 additions and 1 deletions
+7
View File
@@ -188,6 +188,13 @@ void HandleDebuggerRequest(const http::ServerRequest &request) {
WebSocketClientInfo client_info;
auto& disallowed_config = client_info.disallowed;
// Seed every broadcaster category. broadcast.config.set only accepts keys that already exist
// here (so a typo is rejected rather than silently ignored), and these otherwise only appear
// as a side effect of operator[] the first time each category actually broadcasts - which
// meant "game" and "stepping" were rejected as unsupported until one happened to fire, even
// though they're documented and valid. Keep in sync with the Broadcast calls further down.
for (const char *category : { "logger", "input", "game", "stepping" })
disallowed_config[category] = false;
LogBroadcaster logger;
InputBroadcaster input;