commit d5267769cc459c4df1b5a25b40583976d21ed3a6
parent dabd0e0980f80f51b7ffdaba397152b372e864d6
Author: JohnMcPMS <johnmcp@microsoft.com>
Date: Fri, 11 Apr 2025 16:01:15 -0700
Handle not finding metadata (#5350)
Fixes #5349
## Change
Return an empty `hstring` if we don't find a metadata key rather than
attempting to dereference an invalid iterator.
Thanks @luke-patchblox for pointing out the issue precisely (although
you took all the fun out of diagnosing it 😝)
Diffstat:
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/AppInstallerCLIE2ETests/Interop/FindPackagesInterop.cs b/src/AppInstallerCLIE2ETests/Interop/FindPackagesInterop.cs
@@ -216,5 +216,22 @@ namespace AppInstallerCLIE2ETests.Interop
Assert.AreEqual("en-GB", catalogPackageMetadata2.Locale);
Assert.AreEqual("packageNameUK", catalogPackageMetadata2.PackageName);
}
+
+ /// <summary>
+ /// Verifies that GetCatalogPackageMetadata returns the correct metadata based on the specified locale.
+ /// </summary>
+ [Test]
+ public void FindPackagesGetVersionMetadata()
+ {
+ var searchResult = this.FindAllPackages(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.MultipleLocale");
+ Assert.AreEqual(1, searchResult.Count);
+
+ var catalogPackage = searchResult[0].CatalogPackage;
+ var packageVersionId = catalogPackage.AvailableVersions[0];
+ var packageVersionInfo = catalogPackage.GetPackageVersionInfo(packageVersionId);
+
+ string metadata = packageVersionInfo.GetMetadata(PackageVersionMetadataField.SilentUninstallCommand);
+ Assert.IsEmpty(metadata);
+ }
}
-}-
\ No newline at end of file
+}
diff --git a/src/Microsoft.Management.Deployment/PackageVersionInfo.cpp b/src/Microsoft.Management.Deployment/PackageVersionInfo.cpp
@@ -39,6 +39,11 @@ namespace winrt::Microsoft::Management::Deployment::implementation
::AppInstaller::Repository::PackageVersionMetadata metadataKey = GetRepositoryPackageVersionMetadata(metadataField);
::AppInstaller::Repository::IPackageVersion::Metadata metadata = m_packageVersion->GetMetadata();
auto result = metadata.find(metadataKey);
+ if (result == metadata.end())
+ {
+ return {};
+ }
+
hstring resultString = winrt::to_hstring(result->second);
// The api uses "System" rather than "Machine" for install scope.
if (metadataField == PackageVersionMetadataField::InstalledScope && resultString == L"Machine")