@@ -473,10 +473,7 @@ extern "C" HRESULT ExeEngineExecutePackage(
473473 LPWSTR sczCachedDirectory = NULL ;
474474 LPWSTR sczExecutablePath = NULL ;
475475 LPWSTR sczBaseCommand = NULL ;
476- LPWSTR sczUnformattedUserArgs = NULL ;
477476 LPWSTR sczUserArgs = NULL ;
478- LPWSTR sczUserArgsEscaped = NULL ;
479- LPWSTR sczUserArgsEscapedObfuscated = NULL ;
480477 LPWSTR sczUserArgsObfuscated = NULL ;
481478 LPWSTR sczCommandObfuscated = NULL ;
482479 LPWSTR sczArpUninstallString = NULL ;
@@ -589,8 +586,14 @@ extern "C" HRESULT ExeEngineExecutePackage(
589586 }
590587
591588 // now add optional arguments
592- hr = StrAllocString (&sczUnformattedUserArgs, wzArguments && *wzArguments ? wzArguments : L" " , 0 );
593- ExitOnFailure (hr, " Failed to copy package arguments." );
589+ if (wzArguments && *wzArguments)
590+ {
591+ hr = ExeEngineAppendCommandLineArgument (wzArguments, pVariables, FALSE , &sczUserArgs);
592+ ExitOnFailure (hr, " Failed to get command-line arguments." );
593+
594+ hr = ExeEngineAppendCommandLineArgument (wzArguments, pVariables, TRUE , &sczUserArgsObfuscated);
595+ ExitOnFailure (hr, " Failed to get obfuscated command-line arguments." );
596+ }
594597
595598 for (DWORD i = 0 ; i < pPackage->Exe .cCommandLineArguments ; ++i)
596599 {
@@ -605,59 +608,62 @@ extern "C" HRESULT ExeEngineExecutePackage(
605608
606609 if (fCondition )
607610 {
608- if (sczUnformattedUserArgs && !commandLineArgument->fEscape )
609- {
610- hr = StrAllocConcat (&sczUnformattedUserArgs, L" " , 0 );
611- ExitOnFailure (hr, " Failed to separate command-line arguments." );
612- }
613-
614611 switch (pExecuteAction->exePackage .action )
615612 {
616613 case BOOTSTRAPPER_ACTION_STATE_INSTALL:
617614 if (commandLineArgument->fEscape )
618615 {
619- hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczInstallArgument , pVariables, FALSE , &sczUserArgsEscaped );
616+ hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczInstallArgument , pVariables, FALSE , &sczUserArgs );
620617 ExitOnFailure (hr, " Failed to get command-line argument for install." );
621618
622- hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczInstallArgument , pVariables, TRUE , &sczUserArgsEscapedObfuscated );
619+ hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczInstallArgument , pVariables, TRUE , &sczUserArgsObfuscated );
623620 ExitOnFailure (hr, " Failed to get obfuscated command-line argument for install." );
624621 }
625622 else
626623 {
627- hr = StrAllocConcat (&sczUnformattedUserArgs, commandLineArgument->sczInstallArgument , 0 );
624+ hr = ExeEngineAppendCommandLineArgument ( commandLineArgument->sczInstallArgument , pVariables, FALSE , &sczUserArgs );
628625 ExitOnFailure (hr, " Failed to get command-line argument for install." );
626+
627+ hr = ExeEngineAppendCommandLineArgument (commandLineArgument->sczInstallArgument , pVariables, TRUE , &sczUserArgsObfuscated);
628+ ExitOnFailure (hr, " Failed to get obfuscated command-line argument for install." );
629629 }
630630 break ;
631631
632632 case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
633633 if (commandLineArgument->fEscape )
634634 {
635- hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczUninstallArgument , pVariables, FALSE , &sczUserArgsEscaped );
635+ hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczUninstallArgument , pVariables, FALSE , &sczUserArgs );
636636 ExitOnFailure (hr, " Failed to get command-line argument for uninstall." );
637637
638- hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczUninstallArgument , pVariables, TRUE , &sczUserArgsEscapedObfuscated );
638+ hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczUninstallArgument , pVariables, TRUE , &sczUserArgsObfuscated );
639639 ExitOnFailure (hr, " Failed to get obfuscated command-line argument for uninstall." );
640640 }
641641 else
642642 {
643- hr = StrAllocConcat (&sczUnformattedUserArgs, commandLineArgument->sczUninstallArgument , 0 );
643+ hr = ExeEngineAppendCommandLineArgument ( commandLineArgument->sczUninstallArgument , pVariables, FALSE , &sczUserArgs );
644644 ExitOnFailure (hr, " Failed to get command-line argument for uninstall." );
645+
646+ hr = ExeEngineAppendCommandLineArgument (commandLineArgument->sczUninstallArgument , pVariables, TRUE , &sczUserArgsObfuscated);
647+ ExitOnFailure (hr, " Failed to get obfuscated command-line argument for uninstall." );
645648 }
646649 break ;
647650
648651 case BOOTSTRAPPER_ACTION_STATE_REPAIR:
649652 if (commandLineArgument->fEscape )
650653 {
651- hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczRepairArgument , pVariables, FALSE , &sczUserArgsEscaped );
654+ hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczRepairArgument , pVariables, FALSE , &sczUserArgs );
652655 ExitOnFailure (hr, " Failed to get command-line argument for repair." );
653656
654- hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczRepairArgument , pVariables, TRUE , &sczUserArgsEscapedObfuscated );
657+ hr = ExeEngineAppendEscapeCommandLineArgument (commandLineArgument->sczRepairArgument , pVariables, TRUE , &sczUserArgsObfuscated );
655658 ExitOnFailure (hr, " Failed to get obfuscated command-line argument for repair." );
656659 }
657660 else
658661 {
659- hr = StrAllocConcat (&sczUnformattedUserArgs, commandLineArgument->sczRepairArgument , 0 );
662+ hr = ExeEngineAppendCommandLineArgument ( commandLineArgument->sczRepairArgument , pVariables, FALSE , &sczUserArgs );
660663 ExitOnFailure (hr, " Failed to get command-line argument for repair." );
664+
665+ hr = ExeEngineAppendCommandLineArgument (commandLineArgument->sczRepairArgument , pVariables, TRUE , &sczUserArgsObfuscated);
666+ ExitOnFailure (hr, " Failed to get obfuscated command-line argument for repair." );
661667 }
662668 break ;
663669
@@ -714,33 +720,12 @@ extern "C" HRESULT ExeEngineExecutePackage(
714720 }
715721
716722 // build user args
717- if (sczUnformattedUserArgs && *sczUnformattedUserArgs )
723+ if (sczUserArgsObfuscated && *sczUserArgsObfuscated )
718724 {
719- hr = VariableFormatString (pVariables, sczUnformattedUserArgs, &sczUserArgs, NULL );
720- ExitOnFailure (hr, " Failed to format argument string." );
721-
722- hr = VariableFormatStringObfuscated (pVariables, sczUnformattedUserArgs, &sczUserArgsObfuscated, NULL );
723- ExitOnFailure (hr, " Failed to format obfuscated argument string." );
724-
725725 hr = StrAllocFormatted (&sczCommandObfuscated, L" %ls %ls" , sczBaseCommand, sczUserArgsObfuscated);
726726 ExitOnFailure (hr, " Failed to allocate obfuscated exe command." );
727727 }
728728
729- if (sczUserArgsEscaped && *sczUserArgsEscaped)
730- {
731- hr = StrAllocConcat (&sczUserArgs, L" " , 0 );
732- ExitOnFailure (hr, " Failed to concat exe command." );
733-
734- hr = StrAllocConcat (&sczUserArgs, sczUserArgsEscaped, 0 );
735- ExitOnFailure (hr, " Failed to concat exe command." );
736-
737- hr = StrAllocConcat (&sczCommandObfuscated, L" " , 0 );
738- ExitOnFailure (hr, " Failed to concat obfuscated exe command." );
739-
740- hr = StrAllocConcat (&sczCommandObfuscated, sczUserArgsEscapedObfuscated, 0 );
741- ExitOnFailure (hr, " Failed to concat obfuscated exe command." );
742- }
743-
744729 // Log obfuscated command, which won't include raw hidden variable values or protocol specific arguments to avoid exposing secrets.
745730 LogId (REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute (fRollback ), pPackage->sczId , LoggingActionStateToString (pExecuteAction->exePackage .action ), sczExecutablePath, sczCommandObfuscated ? sczCommandObfuscated : sczBaseCommand);
746731
@@ -767,11 +752,8 @@ extern "C" HRESULT ExeEngineExecutePackage(
767752 ReleaseStr (sczCachedDirectory);
768753 ReleaseStr (sczExecutablePath);
769754 ReleaseStr (sczBaseCommand);
770- ReleaseStr (sczUnformattedUserArgs);
771755 StrSecureZeroFreeString (sczUserArgs);
772756 ReleaseStr (sczUserArgsObfuscated);
773- ReleaseStr (sczUserArgsEscapedObfuscated);
774- ReleaseStr (sczUserArgsEscaped);
775757 ReleaseStr (sczCommandObfuscated);
776758 ReleaseStr (sczArpUninstallString);
777759
@@ -1098,6 +1080,42 @@ extern "C" HRESULT ExeEngineAppendEscapeCommandLineArgument(
10981080 return hr;
10991081}
11001082
1083+ extern " C" HRESULT ExeEngineAppendCommandLineArgument (
1084+ __in LPCWSTR szArgument,
1085+ __in BURN_VARIABLES* pVariables,
1086+ __in BOOL fObfuscateHiddenVariables ,
1087+ __deref_out_z LPWSTR* psczArguments
1088+ )
1089+ {
1090+ HRESULT hr = S_OK;
1091+ LPWSTR sz = NULL ;
1092+
1093+ if (fObfuscateHiddenVariables )
1094+ {
1095+ hr = VariableFormatStringObfuscated (pVariables, szArgument, &sz, NULL );
1096+ ExitOnFailure (hr, " Failed to format argument." );
1097+ }
1098+ else
1099+ {
1100+ hr = VariableFormatString (pVariables, szArgument, &sz, NULL );
1101+ ExitOnFailure (hr, " Failed to format argument." );
1102+ }
1103+
1104+ if (*psczArguments && **psczArguments)
1105+ {
1106+ StrAllocConcat (psczArguments, L" " , 0 );
1107+ ExitOnFailure (hr, " Failed to append space." );
1108+ }
1109+
1110+ hr = StrAllocConcat (psczArguments, sz, 0 );
1111+ ExitOnFailure (hr, " Failed to append argument." );
1112+
1113+ LExit:
1114+ ReleaseStr (sz);
1115+
1116+ return hr;
1117+ }
1118+
11011119extern " C" HRESULT ExeEngineHandleExitCode (
11021120 __in BURN_EXE_EXIT_CODE* rgCustomExitCodes,
11031121 __in DWORD cCustomExitCodes,
0 commit comments