aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-10-18 16:01:24 -0500
committerSean Hall <r.sean.hall@gmail.com>2020-10-24 20:07:21 -0500
commita0c40d5a1b8537a6338dacc27a88d236077ab785 (patch)
tree1dd1fed3eebe2d909f7dc10de94dd92b180f3c2f
parent60717700e175d38412559113c8a5388c954c7c91 (diff)
downloadwix-a0c40d5a1b8537a6338dacc27a88d236077ab785.tar.gz
wix-a0c40d5a1b8537a6338dacc27a88d236077ab785.tar.bz2
wix-a0c40d5a1b8537a6338dacc27a88d236077ab785.zip
Allow unsetting version variables.
-rw-r--r--src/engine/EngineForApplication.cpp7
-rw-r--r--src/engine/EngineForExtension.cpp7
-rw-r--r--src/engine/variable.cpp15
-rw-r--r--src/engine/variant.cpp29
4 files changed, 43 insertions, 15 deletions
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(
583 583
584 if (wzVariable && *wzVariable) 584 if (wzVariable && *wzVariable)
585 { 585 {
586 hr = VerParseVersion(wzValue, 0, FALSE, &pVersion); 586 if (wzValue)
587 ExitOnFailure(hr, "Failed to parse new version value."); 587 {
588 hr = VerParseVersion(wzValue, 0, FALSE, &pVersion);
589 ExitOnFailure(hr, "Failed to parse new version value.");
590 }
588 591
589 hr = VariableSetVersion(&pContext->pEngineState->variables, wzVariable, pVersion, FALSE); 592 hr = VariableSetVersion(&pContext->pEngineState->variables, wzVariable, pVersion, FALSE);
590 ExitOnFailure(hr, "Failed to set version variable."); 593 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(
273 273
274 if (wzVariable && *wzVariable) 274 if (wzVariable && *wzVariable)
275 { 275 {
276 hr = VerParseVersion(wzValue, 0, FALSE, &pVersion); 276 if (wzValue)
277 ExitOnFailure(hr, "Failed to parse new version value."); 277 {
278 hr = VerParseVersion(wzValue, 0, FALSE, &pVersion);
279 ExitOnFailure(hr, "Failed to parse new version value.");
280 }
278 281
279 hr = VariableSetVersion(&pContext->pEngineState->variables, wzVariable, pVersion, FALSE); 282 hr = VariableSetVersion(&pContext->pEngineState->variables, wzVariable, pVersion, FALSE);
280 ExitOnFailure(hr, "Failed to set version variable."); 283 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(
1551 case BURN_VARIANT_TYPE_NONE: 1551 case BURN_VARIANT_TYPE_NONE:
1552 if (BURN_VARIANT_TYPE_NONE != pVariables->rgVariables[iVariable].Value.Type) 1552 if (BURN_VARIANT_TYPE_NONE != pVariables->rgVariables[iVariable].Value.Type)
1553 { 1553 {
1554 LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable, pVariant->sczValue); 1554 LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable);
1555 } 1555 }
1556 break; 1556 break;
1557 1557
@@ -1563,7 +1563,7 @@ static HRESULT SetVariableValue(
1563 case BURN_VARIANT_TYPE_STRING: 1563 case BURN_VARIANT_TYPE_STRING:
1564 if (!pVariant->sczValue) 1564 if (!pVariant->sczValue)
1565 { 1565 {
1566 LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable, pVariant->sczValue); 1566 LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable);
1567 } 1567 }
1568 else 1568 else
1569 { 1569 {
@@ -1572,7 +1572,14 @@ static HRESULT SetVariableValue(
1572 break; 1572 break;
1573 1573
1574 case BURN_VARIANT_TYPE_VERSION: 1574 case BURN_VARIANT_TYPE_VERSION:
1575 LogStringLine(REPORT_STANDARD, "Setting version variable '%ls' to value '%ls'", wzVariable, pVariant->pValue->sczVersion); 1575 if (!pVariant->pValue)
1576 {
1577 LogStringLine(REPORT_STANDARD, "Unsetting variable '%ls'", wzVariable);
1578 }
1579 else
1580 {
1581 LogStringLine(REPORT_STANDARD, "Setting version variable '%ls' to value '%ls'", wzVariable, pVariant->pValue->sczVersion);
1582 }
1576 break; 1583 break;
1577 1584
1578 default: 1585 default:
@@ -1581,7 +1588,7 @@ static HRESULT SetVariableValue(
1581 } 1588 }
1582 } 1589 }
1583 1590
1584 if (BURN_VARIANT_TYPE_VERSION == pVariant->Type && pVariant->pValue->fInvalid) 1591 if (BURN_VARIANT_TYPE_VERSION == pVariant->Type && pVariant->pValue && pVariant->pValue->fInvalid)
1585 { 1592 {
1586 LogId(REPORT_WARNING, MSG_VARIABLE_INVALID_VERSION, wzVariable); 1593 LogId(REPORT_WARNING, MSG_VARIABLE_INVALID_VERSION, wzVariable);
1587 } 1594 }
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(
198 case BURN_VARIANT_TYPE_VERSION: 198 case BURN_VARIANT_TYPE_VERSION:
199 BVariantRetrieveVersion(pVariant, &pValue); 199 BVariantRetrieveVersion(pVariant, &pValue);
200 200
201 hr = VerCopyVersion(pValue, ppValue); 201 if (!pValue)
202 {
203 *ppValue = NULL;
204 }
205 else
206 {
207 hr = VerCopyVersion(pValue, ppValue);
208 }
202 break; 209 break;
203 default: 210 default:
204 hr = E_INVALIDARG; 211 hr = E_INVALIDARG;
@@ -275,14 +282,22 @@ extern "C" HRESULT BVariantSetVersion(
275 HRESULT hr = S_OK; 282 HRESULT hr = S_OK;
276 BOOL fEncryptValue = pVariant->fEncryptString; 283 BOOL fEncryptValue = pVariant->fEncryptString;
277 284
278 if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || 285 if (!pValue) // if we're nulling out the version, make the variable NONE.
279 BURN_VARIANT_TYPE_STRING == pVariant->Type)
280 { 286 {
281 StrSecureZeroFreeString(pVariant->sczValue); 287 BVariantUninitialize(pVariant);
282 } 288 }
283 memset(pVariant, 0, sizeof(BURN_VARIANT)); 289 else // assign the value.
284 hr = VerCopyVersion(pValue, &pVariant->pValue); 290 {
285 pVariant->Type = BURN_VARIANT_TYPE_VERSION; 291 if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type ||
292 BURN_VARIANT_TYPE_STRING == pVariant->Type)
293 {
294 StrSecureZeroFreeString(pVariant->sczValue);
295 }
296 memset(pVariant, 0, sizeof(BURN_VARIANT));
297 hr = VerCopyVersion(pValue, &pVariant->pValue);
298 pVariant->Type = BURN_VARIANT_TYPE_VERSION;
299 }
300
286 BVariantSetEncryption(pVariant, fEncryptValue); 301 BVariantSetEncryption(pVariant, fEncryptValue);
287 302
288 return hr; 303 return hr;