diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-06-07 17:28:18 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-06-09 13:47:53 -0500 |
commit | 881a6c9bd0c3b3134277605824dd5a9ceaaf176d (patch) | |
tree | 01d44474bea6f73d265a530510557f5e329291fc /src/burn/engine/engine.cpp | |
parent | 9f360945ce3703677701b12267a42334bbe7dca1 (diff) | |
download | wix-881a6c9bd0c3b3134277605824dd5a9ceaaf176d.tar.gz wix-881a6c9bd0c3b3134277605824dd5a9ceaaf176d.tar.bz2 wix-881a6c9bd0c3b3134277605824dd5a9ceaaf176d.zip |
Update Burn command line parsing to handle unknown args separately.
Parse whole command line in InitializeEngineState but store the indices of unknown args. This allows the engine earlier access to the configuration from the command line, while still allowing CoreInitialize to sanitize the command line before logging it.
Diffstat (limited to 'src/burn/engine/engine.cpp')
-rw-r--r-- | src/burn/engine/engine.cpp | 60 |
1 files changed, 8 insertions, 52 deletions
diff --git a/src/burn/engine/engine.cpp b/src/burn/engine/engine.cpp index f9dd2184..1314ddc6 100644 --- a/src/burn/engine/engine.cpp +++ b/src/burn/engine/engine.cpp | |||
@@ -321,10 +321,8 @@ static HRESULT InitializeEngineState( | |||
321 | ) | 321 | ) |
322 | { | 322 | { |
323 | HRESULT hr = S_OK; | 323 | HRESULT hr = S_OK; |
324 | LPCWSTR wzParam = NULL; | ||
325 | HANDLE hSectionFile = hEngineFile; | 324 | HANDLE hSectionFile = hEngineFile; |
326 | HANDLE hSourceEngineFile = INVALID_HANDLE_VALUE; | 325 | HANDLE hSourceEngineFile = INVALID_HANDLE_VALUE; |
327 | DWORD64 qw = 0; | ||
328 | 326 | ||
329 | pEngineState->automaticUpdates = BURN_AU_PAUSE_ACTION_IFELEVATED; | 327 | pEngineState->automaticUpdates = BURN_AU_PAUSE_ACTION_IFELEVATED; |
330 | pEngineState->dwElevatedLoggingTlsId = TLS_OUT_OF_INDEXES; | 328 | pEngineState->dwElevatedLoggingTlsId = TLS_OUT_OF_INDEXES; |
@@ -332,56 +330,9 @@ static HRESULT InitializeEngineState( | |||
332 | PipeConnectionInitialize(&pEngineState->companionConnection); | 330 | PipeConnectionInitialize(&pEngineState->companionConnection); |
333 | PipeConnectionInitialize(&pEngineState->embeddedConnection); | 331 | PipeConnectionInitialize(&pEngineState->embeddedConnection); |
334 | 332 | ||
335 | for (int i = 0; i < pEngineState->argc; ++i) | 333 | // Parse command line. |
336 | { | 334 | hr = CoreParseCommandLine(pEngineState->argc, pEngineState->argv, &pEngineState->command, &pEngineState->companionConnection, &pEngineState->embeddedConnection, &pEngineState->mode, &pEngineState->automaticUpdates, &pEngineState->fDisableSystemRestore, &pEngineState->internalCommand.sczSourceProcessPath, &pEngineState->internalCommand.sczOriginalSource, &hSectionFile, &hSourceEngineFile, &pEngineState->fDisableUnelevate, &pEngineState->log.dwAttributes, &pEngineState->log.sczPath, &pEngineState->registration.sczActiveParent, &pEngineState->sczIgnoreDependencies, &pEngineState->registration.sczAncestors, &pEngineState->fInvalidCommandLine, &pEngineState->cUnknownArgs, &pEngineState->rgUnknownArgs); |
337 | if (pEngineState->argv[i][0] == L'-') | 335 | ExitOnFailure(hr, "Fatal error while parsing command line."); |
338 | { | ||
339 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &pEngineState->argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED), BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED, lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED))) | ||
340 | { | ||
341 | wzParam = &pEngineState->argv[i][2 + lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED)]; | ||
342 | if (L'=' != wzParam[-1] || L'\0' == wzParam[0]) | ||
343 | { | ||
344 | pEngineState->fInvalidCommandLine = TRUE; | ||
345 | TraceLog(E_INVALIDARG, "Missing required parameter for switch: %ls", BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED); | ||
346 | } | ||
347 | else | ||
348 | { | ||
349 | hr = StrStringToUInt64(wzParam, 0, &qw); | ||
350 | if (FAILED(hr)) | ||
351 | { | ||
352 | TraceLog(hr, "Failed to parse file handle: '%ls'", wzParam); | ||
353 | hr = S_OK; | ||
354 | } | ||
355 | else | ||
356 | { | ||
357 | hSourceEngineFile = (HANDLE)qw; | ||
358 | } | ||
359 | } | ||
360 | } | ||
361 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &pEngineState->argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF), BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF, lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF))) | ||
362 | { | ||
363 | wzParam = &pEngineState->argv[i][2 + lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF)]; | ||
364 | if (L'=' != wzParam[-1] || L'\0' == wzParam[0]) | ||
365 | { | ||
366 | pEngineState->fInvalidCommandLine = TRUE; | ||
367 | TraceLog(E_INVALIDARG, "Missing required parameter for switch: %ls", BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF); | ||
368 | } | ||
369 | else | ||
370 | { | ||
371 | hr = StrStringToUInt64(wzParam, 0, &qw); | ||
372 | if (FAILED(hr)) | ||
373 | { | ||
374 | TraceLog(hr, "Failed to parse file handle: '%ls'", wzParam); | ||
375 | hr = S_OK; | ||
376 | } | ||
377 | else | ||
378 | { | ||
379 | hSectionFile = (HANDLE)qw; | ||
380 | } | ||
381 | } | ||
382 | } | ||
383 | } | ||
384 | } | ||
385 | 336 | ||
386 | hr = SectionInitialize(&pEngineState->section, hSectionFile, hSourceEngineFile); | 337 | hr = SectionInitialize(&pEngineState->section, hSectionFile, hSourceEngineFile); |
387 | ExitOnFailure(hr, "Failed to initialize engine section."); | 338 | ExitOnFailure(hr, "Failed to initialize engine section."); |
@@ -399,6 +350,8 @@ static void UninitializeEngineState( | |||
399 | AppFreeCommandLineArgs(pEngineState->argv); | 350 | AppFreeCommandLineArgs(pEngineState->argv); |
400 | } | 351 | } |
401 | 352 | ||
353 | ReleaseMem(pEngineState->rgUnknownArgs); | ||
354 | |||
402 | ReleaseStr(pEngineState->sczIgnoreDependencies); | 355 | ReleaseStr(pEngineState->sczIgnoreDependencies); |
403 | 356 | ||
404 | PipeConnectionUninitialize(&pEngineState->embeddedConnection); | 357 | PipeConnectionUninitialize(&pEngineState->embeddedConnection); |
@@ -427,6 +380,9 @@ static void UninitializeEngineState( | |||
427 | ReleaseStr(pEngineState->command.wzLayoutDirectory); | 380 | ReleaseStr(pEngineState->command.wzLayoutDirectory); |
428 | ReleaseStr(pEngineState->command.wzCommandLine); | 381 | ReleaseStr(pEngineState->command.wzCommandLine); |
429 | 382 | ||
383 | ReleaseStr(pEngineState->internalCommand.sczOriginalSource); | ||
384 | ReleaseStr(pEngineState->internalCommand.sczSourceProcessPath); | ||
385 | |||
430 | ReleaseStr(pEngineState->log.sczExtension); | 386 | ReleaseStr(pEngineState->log.sczExtension); |
431 | ReleaseStr(pEngineState->log.sczPrefix); | 387 | ReleaseStr(pEngineState->log.sczPrefix); |
432 | ReleaseStr(pEngineState->log.sczPath); | 388 | ReleaseStr(pEngineState->log.sczPath); |