winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 06cb4896b94888844b755d6d9e74339ca4478595
parent f1f49570de5a5e92f51763bb09b8b0af658497ab
Author: JohnMcPMS <johnmcp@microsoft.com>
Date:   Tue, 19 Sep 2023 10:25:20 -0700

Add try/catch when reading upgrade codes to prevent larger user impact than needed (#3637)


Diffstat:
Msrc/AppInstallerRepositoryCore/Microsoft/ARPHelper.cpp | 37++++++++++++++++++++++++-------------
1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.cpp b/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.cpp @@ -77,28 +77,39 @@ namespace AppInstaller::Repository::Microsoft AICLI_LOG(Repo, Info, << "Reading MSI UpgradeCodes"); std::map<std::string, std::string> upgradeCodes; - // There is no UpgradeCodes key on the x86 view of the registry - Registry::Key upgradeCodesKey = Registry::Key::OpenIfExists(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes", 0, KEY_READ | KEY_WOW64_64KEY); - - if (upgradeCodesKey) + try { - for (const auto& upgradeCodeKeyRef : upgradeCodesKey) + // There is no UpgradeCodes key on the x86 view of the registry + Registry::Key upgradeCodesKey = Registry::Key::OpenIfExists(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes", 0, KEY_READ | KEY_WOW64_64KEY); + + if (upgradeCodesKey) { - auto upgradeCode = TryUnpackUpgradeCodeGuid(upgradeCodeKeyRef.Name()); - if (upgradeCode) + for (const auto& upgradeCodeKeyRef : upgradeCodesKey) { - auto upgradeCodeKey = upgradeCodeKeyRef.Open(); - for (const auto& productCodeValue : upgradeCodeKey.Values()) + std::string keyName; + + try { - auto productCode = TryUnpackUpgradeCodeGuid(productCodeValue.Name()); - if (productCode) + keyName = upgradeCodeKeyRef.Name(); + auto upgradeCode = TryUnpackUpgradeCodeGuid(keyName); + if (upgradeCode) { - upgradeCodes[*productCode] = *upgradeCode; + auto upgradeCodeKey = upgradeCodeKeyRef.Open(); + for (const auto& productCodeValue : upgradeCodeKey.Values()) + { + auto productCode = TryUnpackUpgradeCodeGuid(productCodeValue.Name()); + if (productCode) + { + upgradeCodes[*productCode] = *upgradeCode; + } + } } } + CATCH_LOG_MSG("Failed to read upgrade code: %hs", keyName.c_str()); } } - } + } + CATCH_LOG_MSG("Failed to read upgrade codes."); return upgradeCodes; }