From b4fe940cd1cb5798bc3e68a686289b8020cf7110 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 18 Apr 2023 09:02:59 -0700 Subject: [PATCH] Do not crash on Subdirectory when missing Component Directory attribute Fixes 7407 --- src/wix/WixToolset.Core/Compiler.cs | 3 +- .../ComponentFixture.cs | 31 ++++++++++++++++++- .../MissingDirectoryWithSubdirectory.wxs | 10 ++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/Component/MissingDirectoryWithSubdirectory.wxs diff --git a/src/wix/WixToolset.Core/Compiler.cs b/src/wix/WixToolset.Core/Compiler.cs index babde97d6..70e246a57 100644 --- a/src/wix/WixToolset.Core/Compiler.cs +++ b/src/wix/WixToolset.Core/Compiler.cs @@ -2254,8 +2254,7 @@ private void ParseComponentElement(XElement node, ComplexReferenceParentType par { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Directory")); } - - if (!String.IsNullOrEmpty(subdirectory)) + else if (!String.IsNullOrEmpty(subdirectory)) { directoryId = this.Core.CreateDirectoryReferenceFromInlineSyntax(sourceLineNumbers, directoryId, subdirectory); } diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/ComponentFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/ComponentFixture.cs index 94900ee07..9348afa55 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/ComponentFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/ComponentFixture.cs @@ -34,12 +34,41 @@ public void CanDetectDuplicateComponentGuids() }); var errors = result.Messages.Where(m => m.Level == MessageLevel.Error); - Array.Equals(new[] + Assert.Equal(new[] { 369, 369 }, errors.Select(e => e.Id).ToArray()); } } + + [Fact] + public void CannotBuildMissingDirectoryAttributeWithSubdirectory() + { + var folder = TestData.Get(@"TestData"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + var msiPath = Path.Combine(baseFolder, "bin", "test.msi"); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "Component", "MissingDirectoryWithSubdirectory.wxs"), + Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), + "-bindpath", Path.Combine(folder, "SingleFile", "data"), + "-intermediateFolder", intermediateFolder, + "-o", msiPath + }); + + var errors = result.Messages.Select(m => m.ToString()).ToArray(); + WixAssert.CompareLineByLine(new[] + { + "The Component/@Directory attribute was not found; it is required." + }, errors); + } + } } } diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Component/MissingDirectoryWithSubdirectory.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Component/MissingDirectoryWithSubdirectory.wxs new file mode 100644 index 000000000..cefa9abca --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Component/MissingDirectoryWithSubdirectory.wxs @@ -0,0 +1,10 @@ + + + + + + + + + +