From 0ea53e27361cbfe664df98d717e55005f329aff1 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Mon, 16 May 2022 16:03:25 -0500 Subject: Store the prefix character in VERUTIL_VERSION. Fix edge case where version string is all v's. --- src/libs/dutil/WixToolset.DUtil/verutil.cpp | 37 +++++++++++++++++++---------- 1 file changed, 25 insertions(+), 12 deletions(-) (limited to 'src/libs/dutil/WixToolset.DUtil/verutil.cpp') diff --git a/src/libs/dutil/WixToolset.DUtil/verutil.cpp b/src/libs/dutil/WixToolset.DUtil/verutil.cpp index 8881d7bc..30b979b1 100644 --- a/src/libs/dutil/WixToolset.DUtil/verutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/verutil.cpp @@ -194,6 +194,7 @@ DAPI_(HRESULT) VerCopyVersion( hr = StrAllocString(&pCopy->sczVersion, pSource->sczVersion, 0); VerExitOnFailure(hr, "Failed to copy Verutil version string '%ls'.", pSource->sczVersion); + pCopy->chPrefix = pSource->chPrefix; pCopy->dwMajor = pSource->dwMajor; pCopy->dwMinor = pSource->dwMinor; pCopy->dwPatch = pSource->dwPatch; @@ -251,6 +252,7 @@ DAPI_(HRESULT) VerParseVersion( { HRESULT hr = S_OK; VERUTIL_VERSION* pVersion = NULL; + LPCWSTR wzString = NULL; LPCWSTR wzEnd = NULL; LPCWSTR wzPartBegin = NULL; LPCWSTR wzPartEnd = NULL; @@ -277,22 +279,22 @@ DAPI_(HRESULT) VerParseVersion( VerExitOnRootFailure(hr = E_INVALIDARG, "Version string is too long: %Iu", cchVersion); } - if (L'v' == *wzVersion || L'V' == *wzVersion) - { - ++wzVersion; - --cchVersion; - } - pVersion = reinterpret_cast(MemAlloc(sizeof(VERUTIL_VERSION), TRUE)); VerExitOnNull(pVersion, hr, E_OUTOFMEMORY, "Failed to allocate memory for Verutil version '%ls'.", wzVersion); - hr = StrAllocString(&pVersion->sczVersion, wzVersion, cchVersion); - VerExitOnFailure(hr, "Failed to copy Verutil version string '%ls'.", wzVersion); + wzString = wzVersion; + + if (L'v' == *wzString || L'V' == *wzString) + { + pVersion->chPrefix = *wzString; + ++wzString; + --cchVersion; + } - wzVersion = wzPartBegin = wzPartEnd = pVersion->sczVersion; + wzPartBegin = wzPartEnd = wzString; // Save end pointer. - wzEnd = wzVersion + cchVersion; + wzEnd = wzString + cchVersion; // Parse version number while (wzPartBegin < wzEnd) @@ -473,7 +475,7 @@ DAPI_(HRESULT) VerParseVersion( pReleaseLabel->dwValue = uLabel; } - pReleaseLabel->cchLabelOffset = wzPartBegin - pVersion->sczVersion; + pReleaseLabel->cchLabelOffset = wzPartBegin - wzString; pReleaseLabel->cchLabel = cchLabel; if (fTrailingDot) @@ -507,9 +509,20 @@ DAPI_(HRESULT) VerParseVersion( ExitFunction1(hr = E_INVALIDARG); } - pVersion->cchMetadataOffset = min(wzPartBegin, wzEnd) - pVersion->sczVersion; + pVersion->cchMetadataOffset = min(wzPartBegin, wzEnd) - wzString; pVersion->fInvalid = fInvalid; + // If the whole string was invalid, then don't clip off the prefix. + if (!pVersion->cchMetadataOffset && pVersion->chPrefix) + { + pVersion->chPrefix = '\0'; + wzString = wzVersion; + ++cchVersion; + } + + hr = StrAllocString(&pVersion->sczVersion, wzString, cchVersion); + VerExitOnFailure(hr, "Failed to copy Verutil version string '%ls'.", wzVersion); + *ppVersion = pVersion; pVersion = NULL; hr = S_OK; -- cgit v1.2.3-55-g6feb