Skip to content

Windows compiler audit crashes when a completed process PID is reused #489

Description

@pawellisowski

AWARE's Windows compiler auditor crashes when Windows reuses a PID during a full Cargo build.

Observed on Windows x64 at AWARE commit 5590f5af591b4cfe6c915237e7c32543edb87a3c, running the real closed offline release build from cli/build-windows-internal-repro.mjs. The preliminary cargo/rustc identity audits succeeded. The full Cargo audit recorded 77 process creations and 1,891 images before failing.

The retained report contains two link.exe lifetimes with PID 480. The first exited with status 0; the second was appended to report.processes and then failed at Dictionary.Add:

System.ArgumentException: An item with the same key has already been added.
  at System.Collections.Generic.Dictionary`2.Insert(...)
  at AwareCompilerAudit.Run(...)

cli/windows-compiler-audit.ps1 removes exited PIDs from active and handles, but retains them in records and breakpoints. A subsequent CREATE_PROCESS_DEBUG_EVENT for the same PID therefore throws. verifyCompilerAudit in cli/windows-compiler-closure.mjs also requires globally unique PIDs, and image attribution has no lifetime identifier.

Expected: PID reuse after a recorded exit is accepted, while overlapping live processes with the same PID remain invalid. Process images, DLLs, initial breakpoints and exits must remain bound to the correct lifetime. Complete job accounting and image authority verification must remain mandatory.

Related diagnostic gap: launchAuditor throws on auditor failure before runAuditedCompiler persists stdout/stderr. The failed full run also recorded a rustc exit 1 before the crash, but its raw diagnostic output was not retained. A successful rerun must establish whether a separate compiler failure remains.

Evidence is retained locally at C:/rvt-final-cache-20260903/aware-a/evidence/cargo-build-audit.local.json. No completed build, reproducibility result or release is claimed. A deterministic regression should replay CREATE(pid480), EXIT(pid480), CREATE(pid480), including fresh initial-breakpoint handling and distinct image attribution, then exercise the real native/full build.

Related: #488 (closed compiler authority), #480 (integration).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions