diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2022-03-30 17:06:51 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2022-04-01 22:06:11 -0500 |
commit | fec789e9645a0f1dc1d91143bf7592cba8c4f0a2 (patch) | |
tree | 70d0f72762ef8bbfe40e9b915ba2ab679df1b2fb /src | |
parent | 1b61862e5292f007624868e0f40e50a593383200 (diff) | |
download | wix-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.cpp | 29 | ||||
-rw-r--r-- | src/burn/engine/pipe.h | 2 |
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 | ); |
19 | static void FreePipeMessage( | 19 | static 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 | |||
27 | typedef struct _BURN_PIPE_MESSAGE | 27 | typedef 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; |