aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-03-30 17:06:51 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-04-01 22:06:11 -0500
commitfec789e9645a0f1dc1d91143bf7592cba8c4f0a2 (patch)
tree70d0f72762ef8bbfe40e9b915ba2ab679df1b2fb /src
parent1b61862e5292f007624868e0f40e50a593383200 (diff)
downloadwix-fec789e9645a0f1dc1d91143bf7592cba8c4f0a2.tar.gz
wix-fec789e9645a0f1dc1d91143bf7592cba8c4f0a2.tar.bz2
wix-fec789e9645a0f1dc1d91143bf7592cba8c4f0a2.zip
Fix Burn pipe bug where 64-bit code was not interoperable with 32-bit.
Diffstat (limited to 'src')
-rw-r--r--src/burn/engine/pipe.cpp29
-rw-r--r--src/burn/engine/pipe.h2
2 files changed, 20 insertions, 11 deletions
diff --git a/src/burn/engine/pipe.cpp b/src/burn/engine/pipe.cpp
index 80275b52..e6c9905b 100644
--- a/src/burn/engine/pipe.cpp
+++ b/src/burn/engine/pipe.cpp
@@ -14,7 +14,7 @@ static HRESULT AllocatePipeMessage(
14 __in_bcount_opt(cbData) LPVOID pvData, 14 __in_bcount_opt(cbData) LPVOID pvData,
15 __in SIZE_T cbData, 15 __in SIZE_T cbData,
16 __out_bcount(cb) LPVOID* ppvMessage, 16 __out_bcount(cb) LPVOID* ppvMessage,
17 __out SIZE_T* cbMessage 17 __out SIZE_T* pcbMessage
18 ); 18 );
19static void FreePipeMessage( 19static void FreePipeMessage(
20 __in BURN_PIPE_MESSAGE *pMsg 20 __in BURN_PIPE_MESSAGE *pMsg
@@ -553,32 +553,41 @@ static HRESULT AllocatePipeMessage(
553 __in_bcount_opt(cbData) LPVOID pvData, 553 __in_bcount_opt(cbData) LPVOID pvData,
554 __in SIZE_T cbData, 554 __in SIZE_T cbData,
555 __out_bcount(cb) LPVOID* ppvMessage, 555 __out_bcount(cb) LPVOID* ppvMessage,
556 __out SIZE_T* cbMessage 556 __out SIZE_T* pcbMessage
557 ) 557 )
558{ 558{
559 HRESULT hr = S_OK; 559 HRESULT hr = S_OK;
560 LPVOID pv = NULL; 560 LPVOID pv = NULL;
561 SIZE_T cb = 0; 561 size_t cb = 0;
562 DWORD dwcbData = 0;
562 563
563 // If no data was provided, ensure the count of bytes is zero. 564 // If no data was provided, ensure the count of bytes is zero.
564 if (!pvData) 565 if (!pvData)
565 { 566 {
566 cbData = 0; 567 cbData = 0;
567 } 568 }
569 else if (MAXDWORD < cbData)
570 {
571 ExitWithRootFailure(hr, E_INVALIDDATA, "Pipe message is too large.");
572 }
573
574 hr = ::SizeTAdd(sizeof(dwMessage) + sizeof(dwcbData), cbData, &cb);
575 ExitOnRootFailure(hr, "Failed to calculate total pipe message size");
576
577 dwcbData = (DWORD)cbData;
568 578
569 // Allocate the message. 579 // Allocate the message.
570 cb = sizeof(dwMessage) + sizeof(cbData) + cbData;
571 pv = MemAlloc(cb, FALSE); 580 pv = MemAlloc(cb, FALSE);
572 ExitOnNull(pv, hr, E_OUTOFMEMORY, "Failed to allocate memory for message."); 581 ExitOnNull(pv, hr, E_OUTOFMEMORY, "Failed to allocate memory for message.");
573 582
574 memcpy_s(pv, cb, &dwMessage, sizeof(dwMessage)); 583 memcpy_s(pv, cb, &dwMessage, sizeof(dwMessage));
575 memcpy_s(static_cast<BYTE*>(pv) + sizeof(dwMessage), cb - sizeof(dwMessage), &cbData, sizeof(cbData)); 584 memcpy_s(static_cast<BYTE*>(pv) + sizeof(dwMessage), cb - sizeof(dwMessage), &dwcbData, sizeof(dwcbData));
576 if (cbData) 585 if (dwcbData)
577 { 586 {
578 memcpy_s(static_cast<BYTE*>(pv) + sizeof(dwMessage) + sizeof(cbData), cb - sizeof(dwMessage) - sizeof(cbData), pvData, cbData); 587 memcpy_s(static_cast<BYTE*>(pv) + sizeof(dwMessage) + sizeof(dwcbData), cb - sizeof(dwMessage) - sizeof(dwcbData), pvData, dwcbData);
579 } 588 }
580 589
581 *cbMessage = cb; 590 *pcbMessage = cb;
582 *ppvMessage = pv; 591 *ppvMessage = pv;
583 pv = NULL; 592 pv = NULL;
584 593
@@ -627,7 +636,7 @@ static HRESULT GetPipeMessage(
627 ) 636 )
628{ 637{
629 HRESULT hr = S_OK; 638 HRESULT hr = S_OK;
630 BYTE pbMessageAndByteCount[sizeof(DWORD) + sizeof(SIZE_T)] = { }; 639 BYTE pbMessageAndByteCount[sizeof(DWORD) + sizeof(DWORD)] = { };
631 640
632 hr = FileReadHandle(hPipe, pbMessageAndByteCount, sizeof(pbMessageAndByteCount)); 641 hr = FileReadHandle(hPipe, pbMessageAndByteCount, sizeof(pbMessageAndByteCount));
633 if (HRESULT_FROM_WIN32(ERROR_BROKEN_PIPE) == hr) 642 if (HRESULT_FROM_WIN32(ERROR_BROKEN_PIPE) == hr)
@@ -638,7 +647,7 @@ static HRESULT GetPipeMessage(
638 ExitOnFailure(hr, "Failed to read message from pipe."); 647 ExitOnFailure(hr, "Failed to read message from pipe.");
639 648
640 pMsg->dwMessage = *(DWORD*)(pbMessageAndByteCount); 649 pMsg->dwMessage = *(DWORD*)(pbMessageAndByteCount);
641 pMsg->cbData = *(SIZE_T*)(pbMessageAndByteCount + sizeof(DWORD)); 650 pMsg->cbData = *(DWORD*)(pbMessageAndByteCount + sizeof(DWORD));
642 if (pMsg->cbData) 651 if (pMsg->cbData)
643 { 652 {
644 pMsg->pvData = MemAlloc(pMsg->cbData, FALSE); 653 pMsg->pvData = MemAlloc(pMsg->cbData, FALSE);
diff --git a/src/burn/engine/pipe.h b/src/burn/engine/pipe.h
index 4ec6bfa2..f2d8070e 100644
--- a/src/burn/engine/pipe.h
+++ b/src/burn/engine/pipe.h
@@ -27,7 +27,7 @@ typedef enum _BURN_PIPE_MESSAGE_TYPE : DWORD
27typedef struct _BURN_PIPE_MESSAGE 27typedef struct _BURN_PIPE_MESSAGE
28{ 28{
29 DWORD dwMessage; 29 DWORD dwMessage;
30 SIZE_T cbData; 30 DWORD cbData;
31 31
32 BOOL fAllocatedData; 32 BOOL fAllocatedData;
33 LPVOID pvData; 33 LPVOID pvData;