microsoft / microsoft/winget-cli

[WinGetUtil] ValidateManifestInstallers fails for zip installers with appx/msix NestedInstallerType

Open Beginner friendly
#6,080 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue-Bug
Dominant language
C++
Stars
26.4k
Forks
1.8k
Avg merge
1d 11h
Merged PRs (30d)
15

Description

Summary

ValidateManifestInstallers() in ManifestValidation.cpp incorrectly attempts MSIX validation on zip installers that contain nested appx/msix packages. The function uses installer.EffectiveInstallerType() to determine whether to run MsixManifestValidation::Validate(), but for zip installers EffectiveInstallerType() returns the NestedInstallerType (appx → InstallerTypeEnum::Msix), causing it to try opening the raw zip URL as an MSIX package.

Expected Behavior

Manifests with InstallerType: zip and NestedInstallerType: appx should pass ValidateManifestInstallers() without error. The MSIX validation should not attempt to open a zip archive URL as an MSIX package.

Actual Behavior

MsixManifestValidation::Validate() calls GetMsixInfo(installer.Url) on the zip URL. Since the URL points to a .zip archive (not an .appx/.msix file), GetMsixInfo() returns nullptr, and the error InstallerFailedToProcess is emitted for every installer entry:

Failed to process installer. [InstallerUrl] Value: https://github.com/microsoft/winget-cli/releases/download/v1.9.25180/DesktopAppInstaller_Dependencies.zip

The error repeats once per architecture (e.g., 4 times for x64/x86/arm/arm64).

Steps to Reproduce

  1. Use a manifest with InstallerType: zip and NestedInstallerType: appx (e.g., Microsoft.VCLibs.Desktop.14 v14.0.33728.0 from microsoft/winget-pkgs)
  2. Call WinGetValidateManifestV3 with WinGetValidateManifestOptionV2::InstallerValidation
  3. Observe InstallerValidationFailure result with "Failed to process installer" messages

Environment

  • Manifests: Microsoft.VCLibs.Desktop.14 v14.0.33728.0, Microsoft.VCLibs.14 v14.0.33519.0
  • These manifests exist in production microsoft/winget-pkgs

Additional Context

The issue is in ManifestValidation.cpp line ~497:

if (installer.EffectiveInstallerType() == InstallerTypeEnum::Msix)
{
    auto installerErrors = msixManifestValidation.Validate(manifest, installer);
}

EffectiveInstallerType() returns NestedInstallerType for archive types (ManifestInstaller.h line ~50). This check should also verify !IsArchiveType(installer.BaseInstallerType) before running MSIX validation.


🏴‍☠️ This report was assembled by the Straw Hat crew's AI navigator. While we've sailed these waters carefully, the seas are unpredictable — details should be verified by the maintainers.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in ManifestValidation.cpp around line 497 and compare the installer-type handling with EffectiveInstallerType() in ManifestInstaller.h around line 50. Reproduce with the Microsoft.VCLibs.Desktop.14 manifest by calling WinGetValidateManifestV3 with InstallerValidation. Done means zip installers with NestedInstallerType: appx pass without InstallerFailedToProcess errors while direct MSIX validation still works.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
cli
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
72/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.