diff options
author | Bob Arnson <bob@firegiant.com> | 2023-04-24 22:16:34 -0400 |
---|---|---|
committer | Bob Arnson <github@bobs.org> | 2023-04-27 11:07:23 -0400 |
commit | b3b9decfab8a26851e2bc85d777824220ff804b6 (patch) | |
tree | 8c05f1c2c64ca54c91811069468487b5d4a788b2 /src/libs/wcautil/WixToolset.WcaUtil/wcawrap.cpp | |
parent | 3c40f43c76d44787bfc1602cb7d95ea3a0787748 (diff) | |
download | wix-b3b9decfab8a26851e2bc85d777824220ff804b6.tar.gz wix-b3b9decfab8a26851e2bc85d777824220ff804b6.tar.bz2 wix-b3b9decfab8a26851e2bc85d777824220ff804b6.zip |
Fix WcaErrorMessage `cArgs==-1` case.
- Count args before creating message record.
- Document terminating NULL requirement.
- Add terminating NULL in MessageExit* macros.
- Enhance tests for problems encountered fixing this nightmare.
Fixes https://github.com/wixtoolset/issues/issues/7422.
Fixes https://github.com/wixtoolset/issues/issues/7444.
Diffstat (limited to 'src/libs/wcautil/WixToolset.WcaUtil/wcawrap.cpp')
-rw-r--r-- | src/libs/wcautil/WixToolset.WcaUtil/wcawrap.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/libs/wcautil/WixToolset.WcaUtil/wcawrap.cpp b/src/libs/wcautil/WixToolset.WcaUtil/wcawrap.cpp index 86b7602e..9259e97a 100644 --- a/src/libs/wcautil/WixToolset.WcaUtil/wcawrap.cpp +++ b/src/libs/wcautil/WixToolset.WcaUtil/wcawrap.cpp | |||
@@ -27,7 +27,9 @@ WcaErrorMessage() - sends an error message from the CustomAction using | |||
27 | the Error table | 27 | the Error table |
28 | 28 | ||
29 | NOTE: Any and all var_args (...) must be WCHAR* | 29 | NOTE: Any and all var_args (...) must be WCHAR* |
30 | If you pass -1 to cArgs the count will be determined | 30 | If you pass -1 to cArgs, the count will be determined by |
31 | looking for a trailing NULL argment. If you omit a terminating | ||
32 | NULL, the results are undefined and probably crashy. | ||
31 | ********************************************************************/ | 33 | ********************************************************************/ |
32 | extern "C" UINT __cdecl WcaErrorMessage( | 34 | extern "C" UINT __cdecl WcaErrorMessage( |
33 | __in int iError, | 35 | __in int iError, |
@@ -41,6 +43,22 @@ extern "C" UINT __cdecl WcaErrorMessage( | |||
41 | MSIHANDLE hRec = NULL; | 43 | MSIHANDLE hRec = NULL; |
42 | va_list args = NULL; | 44 | va_list args = NULL; |
43 | 45 | ||
46 | if (-1 == cArgs) | ||
47 | { | ||
48 | LPCWSTR wzArg = NULL; | ||
49 | va_list iter = NULL; | ||
50 | |||
51 | va_start(iter, cArgs); | ||
52 | cArgs = 0; | ||
53 | |||
54 | while (NULL != (wzArg = va_arg(iter, WCHAR*)) && L'\0' != *wzArg) | ||
55 | { | ||
56 | ++cArgs; | ||
57 | } | ||
58 | |||
59 | va_end(iter); | ||
60 | } | ||
61 | |||
44 | uiType |= INSTALLMESSAGE_ERROR; // ensure error type is set | 62 | uiType |= INSTALLMESSAGE_ERROR; // ensure error type is set |
45 | hRec = ::MsiCreateRecord(cArgs + 2); | 63 | hRec = ::MsiCreateRecord(cArgs + 2); |
46 | if (!hRec) | 64 | if (!hRec) |
@@ -56,18 +74,6 @@ extern "C" UINT __cdecl WcaErrorMessage( | |||
56 | ExitOnFailure(HRESULT_FROM_WIN32(er), "failed to set hresult code into error message"); | 74 | ExitOnFailure(HRESULT_FROM_WIN32(er), "failed to set hresult code into error message"); |
57 | 75 | ||
58 | va_start(args, cArgs); | 76 | va_start(args, cArgs); |
59 | if (-1 == cArgs) | ||
60 | { | ||
61 | LPCWSTR wzArg = NULL; | ||
62 | va_list iter = args; | ||
63 | cArgs = 0; | ||
64 | |||
65 | while (NULL != (wzArg = va_arg(iter, WCHAR*)) && L'\0' != *wzArg) | ||
66 | { | ||
67 | ++cArgs; | ||
68 | } | ||
69 | } | ||
70 | |||
71 | for (INT i = 0; i < cArgs; i++) | 77 | for (INT i = 0; i < cArgs; i++) |
72 | { | 78 | { |
73 | er = ::MsiRecordSetStringW(hRec, i + 3, va_arg(args, WCHAR*)); | 79 | er = ::MsiRecordSetStringW(hRec, i + 3, va_arg(args, WCHAR*)); |
@@ -76,6 +82,7 @@ extern "C" UINT __cdecl WcaErrorMessage( | |||
76 | va_end(args); | 82 | va_end(args); |
77 | 83 | ||
78 | er = WcaProcessMessage(static_cast<INSTALLMESSAGE>(uiType), hRec); | 84 | er = WcaProcessMessage(static_cast<INSTALLMESSAGE>(uiType), hRec); |
85 | |||
79 | LExit: | 86 | LExit: |
80 | if (args) | 87 | if (args) |
81 | { | 88 | { |