@joebigelow / wix / commits / 84e7b6d2

Prevent crash when Bundle has SWID Tag but child MSI does not

Fixes 6854

Rob Mensching committed Aug 10, 2022 at 13:28 UTC 84e7b6d277e5c3d118e11a45834d420254a758c0
3 files changed +57 -6
src/setup/WixAdditionalTools/WixAdditionalTools.wxs
+1 -2
@@ -13,8 +13,7 @@
13 </BootstrapperApplication>
14
15 <SetVariable Variable="InstallFolder" Value="[ProgramFilesFolder]WiX Toolset v$(SetupMajorMinorVersion)\" />
16 - <!-- TODO: bring back SoftwareTag when #6854 fixed -->
17 - <!-- <SoftwareTag Regid="!(loc.Regid)" InstallPath="[InstallFolder]" /> -->
16 + <SoftwareTag Regid="!(loc.Regid)" InstallPath="[InstallFolder]" />
17
18 <Update Location="!(loc.UpdateUrl)" />
19
src/wix/WixToolset.Core.Burn/Bind/ProcessBundleSoftwareTagsCommand.cs
+6 -3
@@ -71,11 +71,14 @@ namespace WixToolset.Core.Burn.Bind
71
72 using (var db = new Database(payload.SourceFile.Path, OpenDatabase.ReadOnly))
73 {
74 - using (var view = db.OpenExecuteView("SELECT `Regid`, `TagId` FROM `SoftwareIdentificationTag`"))
74 + if (db.TableExists("SoftwareIdentificationTag"))
75 {
76 - foreach (var record in view.Records)
76 + using (var view = db.OpenExecuteView("SELECT `Regid`, `TagId` FROM `SoftwareIdentificationTag`"))
77 {
78 - tags.Add(new SoftwareTag { Regid = record.GetString(1), Id = record.GetString(2) });
78 + foreach (var record in view.Records)
79 + {
80 + tags.Add(new SoftwareTag { Regid = record.GetString(1), Id = record.GetString(2) });
81 + }
82 }
83 }
84 }
src/wix/test/WixToolsetTest.CoreIntegration/SoftwareTagFixture.cs
+50 -1
@@ -13,7 +13,7 @@ namespace WixToolsetTest.CoreIntegration
13 public class SoftwareTagFixture
14 {
15 private static readonly XNamespace BurnManifestNamespace = "http://wixtoolset.org/schemas/v4/2008/Burn";
16 - private static readonly XNamespace SwidTagNamespace = "http://standards.iso.org/iso/19770/-2/2009/schema.xsd";
16 + private static readonly XNamespace SwidTagNamespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd";
17
18 [Fact]
19 public void CanBuildPackageWithTag()
@@ -87,6 +87,55 @@ namespace WixToolsetTest.CoreIntegration
87 var version = docTag.Root.Attribute("version").Value;
88 Assert.Equal("~TagTestBundle", title);
89 Assert.Equal("4.3.2.1", version);
90 +
91 + var msiLink = docTag.Root.Elements(SwidTagNamespace + "Link").Single();
92 + Assert.Equal("component", msiLink.Attribute("rel").Value);
93 + Assert.StartsWith("swid:msi:package/", msiLink.Attribute("href").Value);
94 + }
95 + }
96 + }
97 +
98 + [Fact]
99 + public void CanBuildBundleWithTagWhereMsiDoesNotHaveTag()
100 + {
101 + var testDataFolder = TestData.Get(@"TestData");
102 +
103 + using (var fs = new DisposableFileSystem())
104 + {
105 + var baseFolder = fs.GetFolder();
106 + var intermediateFolder = Path.Combine(baseFolder, "obj");
107 +
108 + var result = WixRunner.Execute(new[]
109 + {
110 + "build",
111 + Path.Combine(testDataFolder, "BundleTag", "BundleWithTag.wxs"),
112 + "-bindpath", Path.Combine(testDataFolder, "SimpleBundle", "data"),
113 + "-intermediateFolder", intermediateFolder,
114 + "-o", Path.Combine(baseFolder, @"bin\test.exe")
115 + });
116 +
117 + result.AssertSuccess();
118 +
119 + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.exe")));
120 + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
121 +
122 + using (var ouput = WixOutput.Read(Path.Combine(baseFolder, @"bin\test.wixpdb")))
123 + {
124 + var badata = ouput.GetDataStream("wix-burndata.xml");
125 + var doc = XDocument.Load(badata);
126 +
127 + var swidTag = doc.Root.Element(BurnManifestNamespace + "Registration").Element(BurnManifestNamespace + "SoftwareTag").Value;
128 +
129 + var swidTagPath = Path.Combine(baseFolder, "test.swidtag");
130 + File.WriteAllText(swidTagPath, swidTag);
131 +
132 + var docTag = XDocument.Load(swidTagPath);
133 + var title = docTag.Root.Attribute("name").Value;
134 + var version = docTag.Root.Attribute("version").Value;
135 + Assert.Equal("~TagTestBundle", title);
136 + Assert.Equal("4.3.2.1", version);
137 +
138 + Assert.Empty(docTag.Root.Elements(SwidTagNamespace + "Link"));
139 }
140 }
141 }