From a0c40d5a1b8537a6338dacc27a88d236077ab785 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 18 Oct 2020 16:01:24 -0500 Subject: Allow unsetting version variables. --- src/engine/EngineForApplication.cpp | 7 +++++-- src/engine/EngineForExtension.cpp | 7 +++++-- src/engine/variable.cpp | 15 +++++++++++---- src/engine/variant.cpp | 29 ++++++++++++++++++++++------- 4 files changed, 43 insertions(+), 15 deletions(-) (limited to 'src/engine') diff --git a/src/engine/EngineForApplication.cpp b/src/engine/EngineForApplication.cpp index c5eb5467..87a0782c 100644 --- a/src/engine/EngineForApplication.cpp +++ b/src/engine/EngineForApplication.cpp @@ -583,8 +583,11 @@ static HRESULT BAEngineSetVariableVersion( if (wzVariable && *wzVariable) { - hr = VerParseVersion(wzValue, 0, FALSE, &pVersion); - ExitOnFailure(hr, "Failed to parse new version value."); + if (wzValue) + { + hr = VerParseVersion(wzValue, 0, FALSE, &pVersion); + ExitOnFailure(hr, "Failed to parse new version value."); + } hr = VariableSetVersion(&pContext->pEngineState->variables, wzVariable, pVersion, FALSE); ExitOnFailure(hr, "Failed to set version variable."); diff --git a/src/engine/EngineForExtension.cpp b/src/engine/EngineForExtension.cpp index c165e2c2..585b74a4 100644 --- a/src/engine/EngineForExtension.cpp +++ b/src/engine/EngineForExtension.cpp @@ -273,8 +273,11 @@ static HRESULT BEEngineSetVariableVersion( if (wzVariable && *wzVariable) { - hr = VerParseVersion(wzValue, 0, FALSE, &pVersion); - ExitOnFailure(hr, "Failed to parse new version value."); + if (wzValue) + { + hr = VerParseVersion(wzValue, 0, FALSE, &pVersion); + ExitOnFailure(hr, "Failed to parse new version value."); + } hr = VariableSetVersion(&pContext->pEngineState->variables, wzVariable, pVersion, FALSE); ExitOnFailure(hr, "Failed to set version variable."); diff --git a/src/engine/variable.cpp b/src/engine/variable.cpp index c2192346..3425b92c 100644 --- a/src/engine/variable.cpp +++ b/src/engine/variable.cpp @@ -1551,7 +1551,7 @@ static HRESULT SetVariableValue( case BURN_VARIANT_TYPE_NONE: if (BURN_VARIANT_TYPE_NONE != pVariables->rgVariables[iVariable].Value.Type) { - LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable, pVariant->sczValue); + LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable); } break; @@ -1563,7 +1563,7 @@ static HRESULT SetVariableValue( case BURN_VARIANT_TYPE_STRING: if (!pVariant->sczValue) { - LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable, pVariant->sczValue); + LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable); } else { @@ -1572,7 +1572,14 @@ static HRESULT SetVariableValue( break; case BURN_VARIANT_TYPE_VERSION: - LogStringLine(REPORT_STANDARD, "Setting version variable '%ls' to value '%ls'", wzVariable, pVariant->pValue->sczVersion); + if (!pVariant->pValue) + { + LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable); + } + else + { + LogStringLine(REPORT_STANDARD, "Setting version variable '%ls' to value '%ls'", wzVariable, pVariant->pValue->sczVersion); + } break; default: @@ -1581,7 +1588,7 @@ static HRESULT SetVariableValue( } } - if (BURN_VARIANT_TYPE_VERSION == pVariant->Type && pVariant->pValue->fInvalid) + if (BURN_VARIANT_TYPE_VERSION == pVariant->Type && pVariant->pValue && pVariant->pValue->fInvalid) { LogId(REPORT_WARNING, MSG_VARIABLE_INVALID_VERSION, wzVariable); } diff --git a/src/engine/variant.cpp b/src/engine/variant.cpp index 9fdb82cd..82f465b2 100644 --- a/src/engine/variant.cpp +++ b/src/engine/variant.cpp @@ -198,7 +198,14 @@ static HRESULT GetVersionInternal( case BURN_VARIANT_TYPE_VERSION: BVariantRetrieveVersion(pVariant, &pValue); - hr = VerCopyVersion(pValue, ppValue); + if (!pValue) + { + *ppValue = NULL; + } + else + { + hr = VerCopyVersion(pValue, ppValue); + } break; default: hr = E_INVALIDARG; @@ -275,14 +282,22 @@ extern "C" HRESULT BVariantSetVersion( HRESULT hr = S_OK; BOOL fEncryptValue = pVariant->fEncryptString; - if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || - BURN_VARIANT_TYPE_STRING == pVariant->Type) + if (!pValue) // if we're nulling out the version, make the variable NONE. { - StrSecureZeroFreeString(pVariant->sczValue); + BVariantUninitialize(pVariant); } - memset(pVariant, 0, sizeof(BURN_VARIANT)); - hr = VerCopyVersion(pValue, &pVariant->pValue); - pVariant->Type = BURN_VARIANT_TYPE_VERSION; + else // assign the value. + { + if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || + BURN_VARIANT_TYPE_STRING == pVariant->Type) + { + StrSecureZeroFreeString(pVariant->sczValue); + } + memset(pVariant, 0, sizeof(BURN_VARIANT)); + hr = VerCopyVersion(pValue, &pVariant->pValue); + pVariant->Type = BURN_VARIANT_TYPE_VERSION; + } + BVariantSetEncryption(pVariant, fEncryptValue); return hr; -- cgit v1.2.3-55-g6feb