Add misc unit tests + harden the WAV chunk walk
Fills small coverage gaps: - shared_memory_test: SharedMemory create-or-open aliasing, move (steal + empty the source, no double-free), reset, open-missing. - wav_test: malformed input -- truncation, bad magic, missing data chunk, over-long data size (clamps), odd-sized chunk (word-align skip), and a corrupt ~4 GB chunk_size. The reader gains an advance guard so that last case can't wrap pos on a 32-bit size_t (x86) or spin the walk; it stops cleanly. - tool_paths_test: deployed_artifact_path resolution -- next-to-exe, one-dir-up, and the not-found fallback -- with real marker files. - audio_ring_test: an overrun-at-the-seam case (write head near the end: a wrapping push that fits vs. an over-capacity wrapping push dropped whole), exercising the wrap split + overrun together, not just at offset 0. The injector bitness check isn't added as a unit test: is_wow64_process is file-local and the real WOW64 path needs a 32-bit target, so it stays inspection-covered (and exercised by the x86 injection path). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -132,7 +132,15 @@ inline bool wav_read(const std::wstring& path, WavData& out)
|
||||
out.pcm.assign(all.begin() + body, all.begin() + body + n);
|
||||
have_data = true;
|
||||
}
|
||||
pos = body + chunk_size + (chunk_size & 1); // chunks are word-aligned
|
||||
// Advance to the next chunk (word-aligned). Guard a corrupt over-long chunk_size: it would
|
||||
// wrap `pos` on a 32-bit size_t (x86) and spin the loop on garbage, and there's nothing valid
|
||||
// past a chunk that claims more than the file holds anyway.
|
||||
const std::size_t advance = static_cast<std::size_t>(chunk_size) + (chunk_size & 1);
|
||||
if (advance > all.size() - body)
|
||||
{
|
||||
break;
|
||||
}
|
||||
pos = body + advance;
|
||||
}
|
||||
return have_fmt && have_data;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user