Skip to content

Nested installer path is built with the manifest's forward slashes, MsiInstallProduct fails with error 2 #6551

Description

@bigtree108-dmytro

Brief description of your issue

When a zip manifest declares NestedInstallerFiles.RelativeFilePath with forward slashes, winget joins it to the extraction directory verbatim and passes the resulting mixed-separator path to MsiInstallProduct. Windows Installer cannot open a package path containing a forward slash, so the install fails with error 2 and an empty MSI log. Normalising the separator when building the nested installer path would make this class of manifest typo harmless.

Steps to reproduce

Install Microsoft.GameInput 3.5.274, whose manifest currently has RelativeFilePath: redist/GameInputRedist.msi:

winget install --id Microsoft.GameInput --exact --version 3.5.274

Actual behavior

[CLI ] Setting installerPath to: ...\Microsoft.GameInput.3.5.274\extracted\redist/GameInputRedist.msi
[CLI ] Installer args: /quiet /norestart /log "...\Microsoft.GameInput.3.5.274-...log"
[CLI ] MsiInstallProduct installer failed: 2
[CLI ] Terminating context: 0x8a150049 at InstallFlow.cpp:239

The log file winget passes to /log is created but stays empty (2 bytes, BOM only), so the failure is invisible to anyone reading the installer log. The Application event log shows a Windows Installer transaction that opens and closes in the same second with no result event, which makes it look like the vendor MSI is at fault.

Expected behavior

The nested installer path is built with backslashes and the package installs.

Evidence that the separator is the cause

Same MSI, same machine, same elevation. Administrative extract used so that nothing is installed and the only variable is the separator:

msiexec /a "...\extracted\redist/GameInputRedist.msi" /quiet TARGETDIR=...  ->  1619 (ERROR_INSTALL_PACKAGE_OPEN_FAILED)
msiexec /a "...\extracted\redist\GameInputRedist.msi" /quiet TARGETDIR=...  ->  0

Installing with the all-backslash path succeeds and registers correctly:

{73E9D910-3C53-4F87-A4EB-1EE11645F494}  Microsoft GameInput  3.5.274.0

MsiOpenPackage tolerates the forward slash, which is why the path looks valid under casual inspection, and the MsiInstaller 1040 event echoes the requested path rather than a validated one.

Note

The specific manifest is fixed in microsoft/winget-pkgs#438904. Filing this separately because the client side could reject or normalise such a path instead of surfacing a bare error 2, and manifest validation could flag forward slashes in RelativeFilePath.

Environment

Windows 11 Pro Education 10.0.26200
winget from Microsoft.DesktopAppInstaller, winget source index 2026.922.622.18

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

    Issue-BugIt either shouldn't be doing this or needs an investigation.

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions