diff options
Diffstat (limited to 'src/dutil/buffutil.cpp')
-rw-r--r-- | src/dutil/buffutil.cpp | 126 |
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 | ||
100 | extern "C" HRESULT BuffReadPointer( | 100 | extern "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 | ||
300 | LExit: | 306 | LExit: |
301 | return hr; | 307 | return hr; |
@@ -304,7 +310,7 @@ LExit: | |||
304 | extern "C" HRESULT BuffWriteNumber( | 310 | extern "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 | ||
323 | LExit: | 329 | LExit: |
@@ -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 | ||
398 | LExit: | 418 | LExit: |
@@ -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 | ||
427 | LExit: | 461 | LExit: |
@@ -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 | ||
457 | LExit: | 497 | LExit: |