aboutsummaryrefslogtreecommitdiff
path: root/src/dutil/buffutil.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-04-28 16:36:56 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-04-29 13:58:14 -0500
commitbcd3ee7ab858d62beb36af9f5986544b68a3dd35 (patch)
tree424c4e61a580b7c4b7481712f69ab0193d76b9c4 /src/dutil/buffutil.cpp
parentd73c29407fe5ec6a0207af7d9c2547457ae0854c (diff)
downloadwix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.tar.gz
wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.tar.bz2
wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.zip
Clean up more 32-bit assumptions.
Diffstat (limited to 'src/dutil/buffutil.cpp')
-rw-r--r--src/dutil/buffutil.cpp126
1 files changed, 83 insertions, 43 deletions
diff --git a/src/dutil/buffutil.cpp b/src/dutil/buffutil.cpp
index a6d3ac90..b6d58cc0 100644
--- a/src/dutil/buffutil.cpp
+++ b/src/dutil/buffutil.cpp
@@ -70,7 +70,7 @@ extern "C" HRESULT BuffReadNumber64(
70 __in SIZE_T cbBuffer, 70 __in SIZE_T cbBuffer,
71 __inout SIZE_T* piBuffer, 71 __inout SIZE_T* piBuffer,
72 __out DWORD64* pdw64 72 __out DWORD64* pdw64
73) 73 )
74{ 74{
75 Assert(pbBuffer); 75 Assert(pbBuffer);
76 Assert(piBuffer); 76 Assert(piBuffer);
@@ -98,11 +98,11 @@ LExit:
98} 98}
99 99
100extern "C" HRESULT BuffReadPointer( 100extern "C" HRESULT BuffReadPointer(
101 __in_bcount(cbBuffer) const BYTE * pbBuffer, 101 __in_bcount(cbBuffer) const BYTE* pbBuffer,
102 __in SIZE_T cbBuffer, 102 __in SIZE_T cbBuffer,
103 __inout SIZE_T* piBuffer, 103 __inout SIZE_T* piBuffer,
104 __out DWORD_PTR* pdw64 104 __out DWORD_PTR* pdw64
105) 105 )
106{ 106{
107 Assert(pbBuffer); 107 Assert(pbBuffer);
108 Assert(piBuffer); 108 Assert(piBuffer);
@@ -141,8 +141,8 @@ extern "C" HRESULT BuffReadString(
141 Assert(pscz); 141 Assert(pscz);
142 142
143 HRESULT hr = S_OK; 143 HRESULT hr = S_OK;
144 DWORD cch = 0; 144 SIZE_T cch = 0;
145 DWORD cb = 0; 145 SIZE_T cb = 0;
146 SIZE_T cbAvailable = 0; 146 SIZE_T cbAvailable = 0;
147 147
148 // get availiable data size 148 // get availiable data size
@@ -150,19 +150,19 @@ extern "C" HRESULT BuffReadString(
150 BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count."); 150 BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count.");
151 151
152 // verify buffer size 152 // verify buffer size
153 if (sizeof(DWORD) > cbAvailable) 153 if (sizeof(SIZE_T) > cbAvailable)
154 { 154 {
155 hr = E_INVALIDARG; 155 hr = E_INVALIDARG;
156 BuffExitOnRootFailure(hr, "Buffer too small."); 156 BuffExitOnRootFailure(hr, "Buffer too small.");
157 } 157 }
158 158
159 // read character count 159 // read character count
160 cch = *(const DWORD*)(pbBuffer + *piBuffer); 160 cch = *(const SIZE_T*)(pbBuffer + *piBuffer);
161 161
162 hr = ::DWordMult(cch, static_cast<DWORD>(sizeof(WCHAR)), &cb); 162 hr = ::SIZETMult(cch, sizeof(WCHAR), &cb);
163 BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size"); 163 BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size");
164 164
165 hr = ::SIZETAdd(*piBuffer, sizeof(DWORD), piBuffer); 165 hr = ::SIZETAdd(*piBuffer, sizeof(SIZE_T), piBuffer);
166 BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size"); 166 BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size");
167 167
168 // get availiable data size 168 // get availiable data size
@@ -198,8 +198,8 @@ extern "C" HRESULT BuffReadStringAnsi(
198 Assert(pscz); 198 Assert(pscz);
199 199
200 HRESULT hr = S_OK; 200 HRESULT hr = S_OK;
201 DWORD cch = 0; 201 SIZE_T cch = 0;
202 DWORD cb = 0; 202 SIZE_T cb = 0;
203 SIZE_T cbAvailable = 0; 203 SIZE_T cbAvailable = 0;
204 204
205 // get availiable data size 205 // get availiable data size
@@ -207,19 +207,19 @@ extern "C" HRESULT BuffReadStringAnsi(
207 BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count."); 207 BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count.");
208 208
209 // verify buffer size 209 // verify buffer size
210 if (sizeof(DWORD) > cbAvailable) 210 if (sizeof(SIZE_T) > cbAvailable)
211 { 211 {
212 hr = E_INVALIDARG; 212 hr = E_INVALIDARG;
213 BuffExitOnRootFailure(hr, "Buffer too small."); 213 BuffExitOnRootFailure(hr, "Buffer too small.");
214 } 214 }
215 215
216 // read character count 216 // read character count
217 cch = *(const DWORD*)(pbBuffer + *piBuffer); 217 cch = *(const SIZE_T*)(pbBuffer + *piBuffer);
218 218
219 hr = ::DWordMult(cch, static_cast<DWORD>(sizeof(CHAR)), &cb); 219 hr = ::SIZETMult(cch, sizeof(CHAR), &cb);
220 BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size"); 220 BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size");
221 221
222 hr = ::SIZETAdd(*piBuffer, sizeof(DWORD), piBuffer); 222 hr = ::SIZETAdd(*piBuffer, sizeof(SIZE_T), piBuffer);
223 BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size"); 223 BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size");
224 224
225 // get availiable data size 225 // get availiable data size
@@ -257,23 +257,24 @@ extern "C" HRESULT BuffReadStream(
257 Assert(pcbStream); 257 Assert(pcbStream);
258 258
259 HRESULT hr = S_OK; 259 HRESULT hr = S_OK;
260 DWORD64 cb = 0; 260 SIZE_T cb = 0;
261 SIZE_T cbAvailable = 0; 261 SIZE_T cbAvailable = 0;
262 errno_t err = 0;
262 263
263 // get availiable data size 264 // get availiable data size
264 hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable); 265 hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable);
265 BuffExitOnRootFailure(hr, "Failed to calculate available data size for stream size."); 266 BuffExitOnRootFailure(hr, "Failed to calculate available data size for stream size.");
266 267
267 // verify buffer size 268 // verify buffer size
268 if (sizeof(DWORD64) > cbAvailable) 269 if (sizeof(SIZE_T) > cbAvailable)
269 { 270 {
270 hr = E_INVALIDARG; 271 hr = E_INVALIDARG;
271 BuffExitOnRootFailure(hr, "Buffer too small."); 272 BuffExitOnRootFailure(hr, "Buffer too small.");
272 } 273 }
273 274
274 // read stream size 275 // read stream size
275 cb = *(const DWORD64*)(pbBuffer + *piBuffer); 276 cb = *(const SIZE_T*)(pbBuffer + *piBuffer);
276 *piBuffer += sizeof(DWORD64); 277 *piBuffer += sizeof(SIZE_T);
277 278
278 // get availiable data size 279 // get availiable data size
279 hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable); 280 hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable);
@@ -287,15 +288,20 @@ extern "C" HRESULT BuffReadStream(
287 } 288 }
288 289
289 // allocate buffer 290 // allocate buffer
290 *ppbStream = (BYTE*)MemAlloc((SIZE_T)cb, TRUE); 291 *ppbStream = (BYTE*)MemAlloc(cb, TRUE);
291 BuffExitOnNull(*ppbStream, hr, E_OUTOFMEMORY, "Failed to allocate stream."); 292 BuffExitOnNull(*ppbStream, hr, E_OUTOFMEMORY, "Failed to allocate stream.");
292 293
293 // read stream data 294 // read stream data
294 memcpy_s(*ppbStream, cbBuffer - *piBuffer, pbBuffer + *piBuffer, (SIZE_T)cb); 295 err = memcpy_s(*ppbStream, cbBuffer - *piBuffer, pbBuffer + *piBuffer, cb);
295 *piBuffer += (SIZE_T)cb; 296 if (err)
297 {
298 BuffExitOnRootFailure(hr = E_INVALIDARG, "Failed to read stream from buffer, error: %d", err);
299 }
300
301 *piBuffer += cb;
296 302
297 // return stream size 303 // return stream size
298 *pcbStream = (SIZE_T)cb; 304 *pcbStream = cb;
299 305
300LExit: 306LExit:
301 return hr; 307 return hr;
@@ -304,7 +310,7 @@ LExit:
304extern "C" HRESULT BuffWriteNumber( 310extern "C" HRESULT BuffWriteNumber(
305 __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, 311 __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer,
306 __inout SIZE_T* piBuffer, 312 __inout SIZE_T* piBuffer,
307 __in DWORD_PTR dw 313 __in DWORD dw
308 ) 314 )
309{ 315{
310 Assert(ppbBuffer); 316 Assert(ppbBuffer);
@@ -317,7 +323,7 @@ extern "C" HRESULT BuffWriteNumber(
317 BuffExitOnFailure(hr, "Failed to ensure buffer size."); 323 BuffExitOnFailure(hr, "Failed to ensure buffer size.");
318 324
319 // copy data to buffer 325 // copy data to buffer
320 *(DWORD_PTR*)(*ppbBuffer + *piBuffer) = dw; 326 *(DWORD*)(*ppbBuffer + *piBuffer) = dw;
321 *piBuffer += sizeof(DWORD); 327 *piBuffer += sizeof(DWORD);
322 328
323LExit: 329LExit:
@@ -351,7 +357,7 @@ extern "C" HRESULT BuffWritePointer(
351 __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, 357 __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer,
352 __inout SIZE_T* piBuffer, 358 __inout SIZE_T* piBuffer,
353 __in DWORD_PTR dw 359 __in DWORD_PTR dw
354) 360 )
355{ 361{
356 Assert(ppbBuffer); 362 Assert(ppbBuffer);
357 Assert(piBuffer); 363 Assert(piBuffer);
@@ -380,19 +386,33 @@ extern "C" HRESULT BuffWriteString(
380 Assert(piBuffer); 386 Assert(piBuffer);
381 387
382 HRESULT hr = S_OK; 388 HRESULT hr = S_OK;
383 DWORD cch = (DWORD)lstrlenW(scz); 389 SIZE_T cch = 0;
384 SIZE_T cb = cch * sizeof(WCHAR); 390 SIZE_T cb = 0;
391 errno_t err = 0;
392
393 if (scz)
394 {
395 hr = ::StringCchLengthW(scz, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cch));
396 BuffExitOnRootFailure(hr, "Failed to get string size.")
397 }
398
399 cb = cch * sizeof(WCHAR);
385 400
386 // make sure we have a buffer with sufficient space 401 // make sure we have a buffer with sufficient space
387 hr = EnsureBufferSize(ppbBuffer, *piBuffer + (sizeof(DWORD) + cb)); 402 hr = EnsureBufferSize(ppbBuffer, *piBuffer + (sizeof(SIZE_T) + cb));
388 BuffExitOnFailure(hr, "Failed to ensure buffer size."); 403 BuffExitOnFailure(hr, "Failed to ensure buffer size.");
389 404
390 // copy character count to buffer 405 // copy character count to buffer
391 *(DWORD*)(*ppbBuffer + *piBuffer) = cch; 406 *(SIZE_T*)(*ppbBuffer + *piBuffer) = cch;
392 *piBuffer += sizeof(DWORD); 407 *piBuffer += sizeof(SIZE_T);
393 408
394 // copy data to buffer 409 // copy data to buffer
395 memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb); 410 err = memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb);
411 if (err)
412 {
413 BuffExitOnRootFailure(hr = E_INVALIDARG, "Failed to write string to buffer: '%ls', error: %d", scz, err);
414 }
415
396 *piBuffer += cb; 416 *piBuffer += cb;
397 417
398LExit: 418LExit:
@@ -409,19 +429,33 @@ extern "C" HRESULT BuffWriteStringAnsi(
409 Assert(piBuffer); 429 Assert(piBuffer);
410 430
411 HRESULT hr = S_OK; 431 HRESULT hr = S_OK;
412 DWORD cch = (DWORD)lstrlenA(scz); 432 SIZE_T cch = 0;
413 SIZE_T cb = cch * sizeof(CHAR); 433 SIZE_T cb = 0;
434 errno_t err = 0;
435
436 if (scz)
437 {
438 hr = ::StringCchLengthA(scz, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cch));
439 BuffExitOnRootFailure(hr, "Failed to get string size.")
440 }
441
442 cb = cch * sizeof(CHAR);
414 443
415 // make sure we have a buffer with sufficient space 444 // make sure we have a buffer with sufficient space
416 hr = EnsureBufferSize(ppbBuffer, *piBuffer + (sizeof(DWORD) + cb)); 445 hr = EnsureBufferSize(ppbBuffer, *piBuffer + (sizeof(SIZE_T) + cb));
417 BuffExitOnFailure(hr, "Failed to ensure buffer size."); 446 BuffExitOnFailure(hr, "Failed to ensure buffer size.");
418 447
419 // copy character count to buffer 448 // copy character count to buffer
420 *(DWORD*)(*ppbBuffer + *piBuffer) = cch; 449 *(SIZE_T*)(*ppbBuffer + *piBuffer) = cch;
421 *piBuffer += sizeof(DWORD); 450 *piBuffer += sizeof(SIZE_T);
422 451
423 // copy data to buffer 452 // copy data to buffer
424 memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb); 453 err = memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb);
454 if (err)
455 {
456 BuffExitOnRootFailure(hr = E_INVALIDARG, "Failed to write string to buffer: '%hs', error: %d", scz, err);
457 }
458
425 *piBuffer += cb; 459 *piBuffer += cb;
426 460
427LExit: 461LExit:
@@ -440,18 +474,24 @@ extern "C" HRESULT BuffWriteStream(
440 Assert(pbStream); 474 Assert(pbStream);
441 475
442 HRESULT hr = S_OK; 476 HRESULT hr = S_OK;
443 DWORD64 cb = cbStream; 477 SIZE_T cb = cbStream;
478 errno_t err = 0;
444 479
445 // make sure we have a buffer with sufficient space 480 // make sure we have a buffer with sufficient space
446 hr = EnsureBufferSize(ppbBuffer, *piBuffer + cbStream + sizeof(DWORD64)); 481 hr = EnsureBufferSize(ppbBuffer, *piBuffer + cbStream + sizeof(SIZE_T));
447 BuffExitOnFailure(hr, "Failed to ensure buffer size."); 482 BuffExitOnFailure(hr, "Failed to ensure buffer size.");
448 483
449 // copy byte count to buffer 484 // copy byte count to buffer
450 *(DWORD64*)(*ppbBuffer + *piBuffer) = cb; 485 *(SIZE_T*)(*ppbBuffer + *piBuffer) = cb;
451 *piBuffer += sizeof(DWORD64); 486 *piBuffer += sizeof(SIZE_T);
452 487
453 // copy data to buffer 488 // copy data to buffer
454 memcpy_s(*ppbBuffer + *piBuffer, cbStream, pbStream, cbStream); 489 err = memcpy_s(*ppbBuffer + *piBuffer, cbStream, pbStream, cbStream);
490 if (err)
491 {
492 BuffExitOnRootFailure(hr = E_INVALIDARG, "Failed to write stream to buffer, error: %d", err);
493 }
494
455 *piBuffer += cbStream; 495 *piBuffer += cbStream;
456 496
457LExit: 497LExit: