From 9bdf3730cd43e1af8a4ea9be6cf2fba77fcff2d2 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Thu, 1 Jul 2021 09:30:10 -0500 Subject: Add bundle option for command line variables to always be uppercase. Fixes #3777 --- src/burn/engine/core.cpp | 9 ++++++- src/burn/engine/variable.cpp | 28 ++++++++++++++++++++++ src/burn/engine/variable.h | 7 ++++++ src/burn/test/BurnUnitTest/ManifestTest.cpp | 1 + .../BasicFunctionality_BundleA_manifest.xml | 2 +- .../PlanTest/MsiTransaction_BundleAv1_manifest.xml | 2 +- .../PlanTest/Slipstream_BundleA_manifest.xml | 2 +- src/burn/test/BurnUnitTest/VariableTest.cpp | 3 +++ 8 files changed, 50 insertions(+), 4 deletions(-) (limited to 'src/burn') diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index ca613dc5..8b97952c 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp @@ -1699,7 +1699,14 @@ static HRESULT GetSanitizedCommandLine( const wchar_t* pwc = wcschr(argv[i], L'='); if (pwc) { - hr = StrAllocString(&sczVariableName, argv[i], pwc - argv[i]); + if (BURN_VARIABLE_COMMAND_LINE_TYPE_UPPER_CASE == pVariables->commandLineType) + { + hr = StrAllocStringToUpperInvariant(&sczVariableName, argv[i], pwc - argv[i]); + } + else + { + hr = StrAllocString(&sczVariableName, argv[i], pwc - argv[i]); + } ExitOnFailure(hr, "Failed to copy variable name."); hr = VariableIsHidden(pVariables, sczVariableName, &fHidden); diff --git a/src/burn/engine/variable.cpp b/src/burn/engine/variable.cpp index 6f818ff3..e2b1f1f2 100644 --- a/src/burn/engine/variable.cpp +++ b/src/burn/engine/variable.cpp @@ -294,6 +294,7 @@ extern "C" HRESULT VariablesParseFromXml( ) { HRESULT hr = S_OK; + IXMLDOMNode* pixnCommandLine = NULL; IXMLDOMNodeList* pixnNodes = NULL; IXMLDOMNode* pixnNode = NULL; DWORD cNodes = 0; @@ -307,6 +308,32 @@ extern "C" HRESULT VariablesParseFromXml( ::EnterCriticalSection(&pVariables->csAccess); + // select registration node + hr = XmlSelectSingleNode(pixnBundle, L"CommandLine", &pixnCommandLine); + if (S_FALSE == hr) + { + hr = E_NOTFOUND; + } + ExitOnFailure(hr, "Failed to select CommandLine node."); + + // @Variables + hr = XmlGetAttributeEx(pixnCommandLine, L"Variables", &scz); + ExitOnFailure(hr, "Failed to get CommandLine/@Variables."); + + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"upperCase", -1)) + { + pVariables->commandLineType = BURN_VARIABLE_COMMAND_LINE_TYPE_UPPER_CASE; + } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"caseSensitive", -1)) + { + pVariables->commandLineType = BURN_VARIABLE_COMMAND_LINE_TYPE_CASE_SENSITIVE; + } + else + { + hr = E_INVALIDARG; + ExitOnFailure(hr, "Invalid value for CommandLine/@Variables: %ls", scz); + } + // select variable nodes hr = XmlSelectNodes(pixnBundle, L"Variable", &pixnNodes); ExitOnFailure(hr, "Failed to select variable nodes."); @@ -434,6 +461,7 @@ extern "C" HRESULT VariablesParseFromXml( LExit: ::LeaveCriticalSection(&pVariables->csAccess); + ReleaseObject(pixnCommandLine); ReleaseObject(pixnNodes); ReleaseObject(pixnNode); ReleaseStr(scz); diff --git a/src/burn/engine/variable.h b/src/burn/engine/variable.h index a38c9daa..9ed86ca7 100644 --- a/src/burn/engine/variable.h +++ b/src/burn/engine/variable.h @@ -25,6 +25,12 @@ typedef HRESULT (*PFN_INITIALIZEVARIABLE)( // constants +enum BURN_VARIABLE_COMMAND_LINE_TYPE +{ + BURN_VARIABLE_COMMAND_LINE_TYPE_UPPER_CASE, + BURN_VARIABLE_COMMAND_LINE_TYPE_CASE_SENSITIVE, +}; + enum BURN_VARIABLE_INTERNAL_TYPE { BURN_VARIABLE_INTERNAL_TYPE_NORMAL, // the BA can set this variable. @@ -54,6 +60,7 @@ typedef struct _BURN_VARIABLES DWORD dwMaxVariables; DWORD cVariables; BURN_VARIABLE* rgVariables; + BURN_VARIABLE_COMMAND_LINE_TYPE commandLineType; } BURN_VARIABLES; diff --git a/src/burn/test/BurnUnitTest/ManifestTest.cpp b/src/burn/test/BurnUnitTest/ManifestTest.cpp index 963be156..345ddfd9 100644 --- a/src/burn/test/BurnUnitTest/ManifestTest.cpp +++ b/src/burn/test/BurnUnitTest/ManifestTest.cpp @@ -37,6 +37,7 @@ namespace Bootstrapper " " "