From ba93485c940b0bae6e0b6a005fdd1819652f3984 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Thu, 4 Apr 2024 15:41:57 -0700 Subject: Report E_MOREDATA from Bal functions when string buffer too small WiX v4 (and probably v3) standardized on the error code E_MOREDATA when string buffers were too small instead of E_INSUFFICIIENT_BUFFER. This fixes v5 to match in a few missing cases. Fixes 8094 --- src/api/burn/balutil/BalBootstrapperEngine.cpp | 20 ++++++++++++++++++++ .../WixStdBaTests/BalCondition/BalCondition.wixproj | 18 ++++++++++++++++++ .../WixStdBaTests/BalCondition/BalCondition.wxs | 18 ++++++++++++++++++ .../burn/WixToolsetTest.BurnE2E/WixStdBaTests.cs | 17 +++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wixproj create mode 100644 src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wxs diff --git a/src/api/burn/balutil/BalBootstrapperEngine.cpp b/src/api/burn/balutil/BalBootstrapperEngine.cpp index b924906e..28608cb9 100644 --- a/src/api/burn/balutil/BalBootstrapperEngine.cpp +++ b/src/api/burn/balutil/BalBootstrapperEngine.cpp @@ -216,6 +216,10 @@ public: // IBootstrapperEngine if (wzValue) { hr = ::StringCchCopyW(wzValue, *pcchValue, results.wzValue); + if (E_INSUFFICIENT_BUFFER == hr) + { + hr = E_MOREDATA; + } } else if (results.cchValue) { @@ -292,6 +296,10 @@ public: // IBootstrapperEngine if (wzValue) { hr = ::StringCchCopyW(wzValue, *pcchValue, results.wzValue); + if (E_INSUFFICIENT_BUFFER == hr) + { + hr = E_MOREDATA; + } } else if (results.cchValue) { @@ -373,6 +381,10 @@ public: // IBootstrapperEngine if (wzValue) { hr = ::StringCchCopyW(wzValue, *pcchValue, results.wzValue); + if (E_INSUFFICIENT_BUFFER == hr) + { + hr = E_MOREDATA; + } } else if (results.cchValue) { @@ -449,6 +461,10 @@ public: // IBootstrapperEngine if (wzOut) { hr = ::StringCchCopyW(wzOut, *pcchOut, results.wzOut); + if (E_INSUFFICIENT_BUFFER == hr) + { + hr = E_MOREDATA; + } } else if (results.cchOut) { @@ -525,6 +541,10 @@ public: // IBootstrapperEngine if (wzOut) { hr = ::StringCchCopyW(wzOut, *pcchOut, results.wzOut); + if (E_INSUFFICIENT_BUFFER == hr) + { + hr = E_MOREDATA; + } } else if (results.cchOut) { diff --git a/src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wixproj b/src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wixproj new file mode 100644 index 00000000..7e0224e2 --- /dev/null +++ b/src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wixproj @@ -0,0 +1,18 @@ + + + + + Bundle + hyperlinkLicense + {42CCE8AB-777A-481F-9EA2-0B5B10179E8A} + $(DefineConstants);Version=1.0 + + + + + + + + + + diff --git a/src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wxs b/src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wxs new file mode 100644 index 00000000..e3c36df7 --- /dev/null +++ b/src/test/burn/TestData/WixStdBaTests/BalCondition/BalCondition.wxs @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/WixToolsetTest.BurnE2E/WixStdBaTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/WixStdBaTests.cs index ec7bca6f..45a122a4 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/WixStdBaTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/WixStdBaTests.cs @@ -9,6 +9,23 @@ namespace WixToolsetTest.BurnE2E { public WixStdBaTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } + [RuntimeFact] + public void SucceedsWithMultipleConditions() + { + var packageA = this.CreatePackageInstaller("PackageA"); + var bundle = this.CreateBundleInstaller("BalCondition"); + + packageA.VerifyInstalled(false); + + bundle.Install(); + bundle.VerifyRegisteredAndInPackageCache(); + packageA.VerifyInstalled(true); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(); + packageA.VerifyInstalled(false); + } + [RuntimeFact] public void ExitsWithErrorWhenDowngradingWithoutSuppression() { -- cgit v1.2.3-55-g6feb