Audio overrides: lossless UTF-8 name round-trip (no high-bit collision)

The per-game override store keyed and persisted image names through narrow(), which
masked each character with & 0x7F, and widen() used the full byte -- not a true
inverse. So a non-ASCII exe name was corrupted on reload, and two names differing
only in their high bits collapsed onto the same key (e.g. U+00E9 'é' masked to
'i', so "café.exe" collided with "cafi.exe").

Use real WideCharToMultiByte/MultiByteToWideChar(CP_UTF8) so the round-trip is
lossless for any Unicode name. ASCII names are byte-identical under UTF-8, so
existing override files stay compatible.

audio_overrides_test gains a high-bit-collision case (café vs cafi, built from a
code point to keep the source ASCII) plus a non-ASCII persist/reload check -- both
of which the old 7-bit mask failed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 01:52:01 +02:00
parent 5e9b1cde4c
commit 6840d9df88
3 changed files with 29 additions and 9 deletions

View File

@@ -115,7 +115,6 @@ as its own commit; "verify" items are confirmed real before any change, and drop
Cross-process / ABI:
- **`log_ring` torn-text window** — verify the MPSC overwrite race; fix or bound it.
- **`narrow`/`widen` not inverse** — make the audio-override name round-trip lossless (or document).
Test coverage:
- **`log_ring`** — threaded push/drain + wrap-skip generation test (currently zero coverage).