Skip to content

fix(self-update): minimal asInvoker manifest — stop uffs-update.exe SxS crash (os error 14001)#456

Merged
githubrobbi merged 1 commit into
mainfrom
fix/uffs-update-manifest-sxs-14001
Jun 18, 2026
Merged

fix(self-update): minimal asInvoker manifest — stop uffs-update.exe SxS crash (os error 14001)#456
githubrobbi merged 1 commit into
mainfrom
fix/uffs-update-manifest-sxs-14001

Conversation

@githubrobbi

Copy link
Copy Markdown
Collaborator

Problem

After #454 shipped (v0.6.9), uffs-update.exe fails to start at all on Windows:

The application has failed to start because its side-by-side configuration is
incorrect. ... (os error 14001)   # ERROR_SXS_CANT_GEN_ACTCTX

Every invocation dies — including the apply-phase smoke test (uffs-update --version) — so uffs --update rolls back with "smoke test failed for uffs-update". The self-updater can't even update itself.

Root cause

The asInvoker manifest added in #454 (to defeat Installer Detection / os error 740) also carried <assemblyIdentity>, a <compatibility> supportedOS block, and <windowsSettings>. <assemblyIdentity> in an application manifest makes the loader attempt a side-by-side assembly resolution that fails for a plain console binary → ERROR_SXS_CANT_GEN_ACTCTX (14001).

uffs.exe happened to survive the same elements, but uffs-update.exe did not — so rather than chase the exact divergence, strip the manifest to only what this helper needs.

Fix

Reduce app.manifest to a single trustInfo/asInvoker block — removing every SxS activation-context surface (assemblyIdentity, compatibility, windowsSettings). This:

Verification

Cross-compiled with cargo xwin and inspected the embedded PE manifest:

  • requestedExecutionLevel level="asInvoker"present (1)
  • real <assemblyIdentity type=>0
  • real <supportedOS Id=>0

🤖 Generated with Claude Code

…xS crash (os error 14001)

The asInvoker manifest added in #454 (to defeat Installer Detection / os
error 740) made the cross-compiled uffs-update.exe fail to *start at all*
on Windows with ERROR_SXS_CANT_GEN_ACTCTX (os error 14001, "side-by-side
configuration is incorrect"). Every invocation died, including the
apply-phase smoke test (`uffs-update --version`), so `uffs --update`
rolled back with "smoke test failed for uffs-update".

Root cause: the richer manifest carried `<assemblyIdentity>` (plus a
`<compatibility>` supportedOS block and `<windowsSettings>`).
`<assemblyIdentity>` in an application manifest makes the loader attempt a
side-by-side assembly resolution that fails for a plain console binary —
ERROR_SXS_CANT_GEN_ACTCTX.

Fix: strip the manifest to the single thing this helper needs — a
`trustInfo`/`asInvoker` block — removing every SxS activation-context
surface. This keeps the #454 740-fix (asInvoker still defeats Installer
Detection) while eliminating the 14001 crash.

Verified by cross-compiling (cargo xwin) and inspecting the embedded PE
manifest: `requestedExecutionLevel level="asInvoker"` present; zero real
`<assemblyIdentity type=>` / `<supportedOS Id=>` elements.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@githubrobbi githubrobbi enabled auto-merge (squash) June 18, 2026 03:34
@githubrobbi githubrobbi merged commit bc3280f into main Jun 18, 2026
21 checks passed
@githubrobbi githubrobbi deleted the fix/uffs-update-manifest-sxs-14001 branch June 18, 2026 03:48
githubrobbi added a commit that referenced this pull request Jun 18, 2026
…S 14001 cause (#457)

The actual root cause of uffs-update.exe failing to start with
ERROR_SXS_CANT_GEN_ACTCTX (os error 14001, "Invalid Xml syntax ... on
line 1") was a literal double hyphen inside the manifest's XML comment:
the comment body contained the example CLI invocation `uffs --update`,
and XML forbids "--" anywhere inside a <!-- --> comment. Windows' strict
side-by-side manifest parser rejected the whole manifest.

This was present in BOTH the original #454 manifest and the #456
"minimal" rewrite — both carried that same `uffs --update` line in the
comment — which is why #456 (dropping <assemblyIdentity>) did not fix it.
The Application event log (SideBySide id 59) pinpointed it: "Error in
manifest or policy file ... on line 1. Invalid Xml syntax."

Fix: reword the comment so no "--" appears in the body, and add an
explicit DO-NOT-USE-double-hyphen warning so this never regresses.

Verified by extracting the embedded RT_MANIFEST from a freshly
cross-compiled uffs-update.exe and running `xmllint --noout` on it:
now well-formed (previously malformed). asInvoker is retained, so the
#454 Installer-Detection / os error 740 fix still stands.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant