diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-04-28 16:36:56 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-04-29 13:58:14 -0500 |
commit | bcd3ee7ab858d62beb36af9f5986544b68a3dd35 (patch) | |
tree | 424c4e61a580b7c4b7481712f69ab0193d76b9c4 | |
parent | d73c29407fe5ec6a0207af7d9c2547457ae0854c (diff) | |
download | wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.tar.gz wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.tar.bz2 wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.zip |
Clean up more 32-bit assumptions.
-rw-r--r-- | src/dutil/acl2util.cpp | 10 | ||||
-rw-r--r-- | src/dutil/apuputil.cpp | 2 | ||||
-rw-r--r-- | src/dutil/buffutil.cpp | 126 | ||||
-rw-r--r-- | src/dutil/cryputil.cpp | 16 | ||||
-rw-r--r-- | src/dutil/deputil.cpp | 12 | ||||
-rw-r--r-- | src/dutil/dirutil.cpp | 2 | ||||
-rw-r--r-- | src/dutil/dutil.cpp | 10 | ||||
-rw-r--r-- | src/dutil/eseutil.cpp | 31 | ||||
-rw-r--r-- | src/dutil/fileutil.cpp | 149 | ||||
-rw-r--r-- | src/dutil/inc/aclutil.h | 2 | ||||
-rw-r--r-- | src/dutil/inc/buffutil.h | 2 | ||||
-rw-r--r-- | src/dutil/inc/fileutil.h | 7 | ||||
-rw-r--r-- | src/dutil/inc/pathutil.h | 12 | ||||
-rw-r--r-- | src/dutil/inc/strutil.h | 4 | ||||
-rw-r--r-- | src/dutil/inc/verutil.h | 2 | ||||
-rw-r--r-- | src/dutil/inetutil.cpp | 11 | ||||
-rw-r--r-- | src/dutil/logutil.cpp | 6 | ||||
-rw-r--r-- | src/dutil/metautil.cpp | 9 | ||||
-rw-r--r-- | src/dutil/pathutil.cpp | 58 | ||||
-rw-r--r-- | src/dutil/regutil.cpp | 18 | ||||
-rw-r--r-- | src/dutil/reswutil.cpp | 7 | ||||
-rw-r--r-- | src/dutil/strutil.cpp | 129 | ||||
-rw-r--r-- | src/dutil/thmutil.cpp | 5 | ||||
-rw-r--r-- | src/dutil/verutil.cpp | 11 | ||||
-rw-r--r-- | src/dutil/xmlutil.cpp | 2 | ||||
-rw-r--r-- | src/test/DUtilUnitTest/FileUtilTest.cpp | 10 |
26 files changed, 446 insertions, 207 deletions
diff --git a/src/dutil/acl2util.cpp b/src/dutil/acl2util.cpp index 5aba60f0..598f12e7 100644 --- a/src/dutil/acl2util.cpp +++ b/src/dutil/acl2util.cpp | |||
@@ -23,7 +23,7 @@ NOTE: psczSid should be freed with StrFree() | |||
23 | ********************************************************************/ | 23 | ********************************************************************/ |
24 | extern "C" HRESULT DAPI AclCalculateServiceSidString( | 24 | extern "C" HRESULT DAPI AclCalculateServiceSidString( |
25 | __in LPCWSTR wzServiceName, | 25 | __in LPCWSTR wzServiceName, |
26 | __in int cchServiceName, | 26 | __in SIZE_T cchServiceName, |
27 | __deref_out_z LPWSTR* psczSid | 27 | __deref_out_z LPWSTR* psczSid |
28 | ) | 28 | ) |
29 | { | 29 | { |
@@ -39,7 +39,7 @@ extern "C" HRESULT DAPI AclCalculateServiceSidString( | |||
39 | 39 | ||
40 | if (0 == cchServiceName) | 40 | if (0 == cchServiceName) |
41 | { | 41 | { |
42 | hr = ::StringCchLengthW(wzServiceName, INT_MAX, reinterpret_cast<size_t*>(&cchServiceName)); | 42 | hr = ::StringCchLengthW(wzServiceName, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchServiceName)); |
43 | AclExitOnFailure(hr, "Failed to get the length of the service name."); | 43 | AclExitOnFailure(hr, "Failed to get the length of the service name."); |
44 | } | 44 | } |
45 | 45 | ||
@@ -49,7 +49,7 @@ extern "C" HRESULT DAPI AclCalculateServiceSidString( | |||
49 | pbHash = reinterpret_cast<BYTE*>(MemAlloc(cbHash, TRUE)); | 49 | pbHash = reinterpret_cast<BYTE*>(MemAlloc(cbHash, TRUE)); |
50 | AclExitOnNull(pbHash, hr, E_OUTOFMEMORY, "Failed to allocate hash byte array."); | 50 | AclExitOnNull(pbHash, hr, E_OUTOFMEMORY, "Failed to allocate hash byte array."); |
51 | 51 | ||
52 | hr = CrypHashBuffer(reinterpret_cast<BYTE*>(sczUpperServiceName), cchServiceName * 2, PROV_RSA_FULL, CALG_SHA1, pbHash, cbHash); | 52 | hr = CrypHashBuffer(reinterpret_cast<BYTE*>(sczUpperServiceName), cchServiceName * sizeof(WCHAR), PROV_RSA_FULL, CALG_SHA1, pbHash, cbHash); |
53 | AclExitOnNull(pbHash, hr, E_OUTOFMEMORY, "Failed to hash the service name."); | 53 | AclExitOnNull(pbHash, hr, E_OUTOFMEMORY, "Failed to hash the service name."); |
54 | 54 | ||
55 | hr = StrAllocFormatted(psczSid, L"S-1-5-80-%u-%u-%u-%u-%u", | 55 | hr = StrAllocFormatted(psczSid, L"S-1-5-80-%u-%u-%u-%u-%u", |
@@ -80,7 +80,7 @@ extern "C" HRESULT DAPI AclGetAccountSidStringEx( | |||
80 | ) | 80 | ) |
81 | { | 81 | { |
82 | HRESULT hr = S_OK; | 82 | HRESULT hr = S_OK; |
83 | int cchAccount = 0; | 83 | SIZE_T cchAccount = 0; |
84 | PSID psid = NULL; | 84 | PSID psid = NULL; |
85 | LPWSTR pwz = NULL; | 85 | LPWSTR pwz = NULL; |
86 | LPWSTR sczSid = NULL; | 86 | LPWSTR sczSid = NULL; |
@@ -103,7 +103,7 @@ extern "C" HRESULT DAPI AclGetAccountSidStringEx( | |||
103 | { | 103 | { |
104 | if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr) | 104 | if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr) |
105 | { | 105 | { |
106 | HRESULT hrLength = ::StringCchLengthW(wzAccount, INT_MAX, reinterpret_cast<size_t*>(&cchAccount)); | 106 | HRESULT hrLength = ::StringCchLengthW(wzAccount, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchAccount)); |
107 | AclExitOnFailure(hrLength, "Failed to get the length of the account name."); | 107 | AclExitOnFailure(hrLength, "Failed to get the length of the account name."); |
108 | 108 | ||
109 | if (11 < cchAccount && CSTR_EQUAL == CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, L"NT SERVICE\\", 11, wzAccount, 11)) | 109 | if (11 < cchAccount && CSTR_EQUAL == CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, L"NT SERVICE\\", 11, wzAccount, 11)) |
diff --git a/src/dutil/apuputil.cpp b/src/dutil/apuputil.cpp index 6f5825bb..eb96d515 100644 --- a/src/dutil/apuputil.cpp +++ b/src/dutil/apuputil.cpp | |||
@@ -388,7 +388,7 @@ static HRESULT ParseEnclosure( | |||
388 | if (dwDigestStringLength != cchDigestString) | 388 | if (dwDigestStringLength != cchDigestString) |
389 | { | 389 | { |
390 | hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); | 390 | hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); |
391 | ApupExitOnRootFailure(hr, "Invalid digest length (%zu) for digest algorithm (%u).", cchDigestString, dwDigestStringLength); | 391 | ApupExitOnRootFailure(hr, "Invalid digest length (%Iu) for digest algorithm (%u).", cchDigestString, dwDigestStringLength); |
392 | } | 392 | } |
393 | 393 | ||
394 | pEnclosure->cbDigest = sizeof(BYTE) * dwDigestLength; | 394 | pEnclosure->cbDigest = sizeof(BYTE) * dwDigestLength; |
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: |
diff --git a/src/dutil/cryputil.cpp b/src/dutil/cryputil.cpp index c5c1b221..24bb83f1 100644 --- a/src/dutil/cryputil.cpp +++ b/src/dutil/cryputil.cpp | |||
@@ -291,6 +291,9 @@ HRESULT DAPI CrypHashBuffer( | |||
291 | HRESULT hr = S_OK; | 291 | HRESULT hr = S_OK; |
292 | HCRYPTPROV hProv = NULL; | 292 | HCRYPTPROV hProv = NULL; |
293 | HCRYPTHASH hHash = NULL; | 293 | HCRYPTHASH hHash = NULL; |
294 | DWORD cbDataHashed = 0; | ||
295 | SIZE_T cbTotal = 0; | ||
296 | SIZE_T cbRemaining = 0; | ||
294 | 297 | ||
295 | // get handle to the crypto provider | 298 | // get handle to the crypto provider |
296 | if (!::CryptAcquireContextW(&hProv, NULL, NULL, dwProvType, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) | 299 | if (!::CryptAcquireContextW(&hProv, NULL, NULL, dwProvType, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) |
@@ -304,10 +307,17 @@ HRESULT DAPI CrypHashBuffer( | |||
304 | CrypExitWithLastError(hr, "Failed to initiate hash."); | 307 | CrypExitWithLastError(hr, "Failed to initiate hash."); |
305 | } | 308 | } |
306 | 309 | ||
307 | if (!::CryptHashData(hHash, pbBuffer, static_cast<DWORD>(cbBuffer), 0)) | 310 | do |
308 | { | 311 | { |
309 | CrypExitWithLastError(hr, "Failed to hash data."); | 312 | cbRemaining = cbBuffer - cbTotal; |
310 | } | 313 | cbDataHashed = (DWORD)min(DWORD_MAX, cbRemaining); |
314 | if (!::CryptHashData(hHash, pbBuffer + cbTotal, cbDataHashed, 0)) | ||
315 | { | ||
316 | CrypExitWithLastError(hr, "Failed to hash data."); | ||
317 | } | ||
318 | |||
319 | cbTotal += cbDataHashed; | ||
320 | } while (cbTotal < cbBuffer); | ||
311 | 321 | ||
312 | // get hash value | 322 | // get hash value |
313 | if (!::CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &cbHash, 0)) | 323 | if (!::CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &cbHash, 0)) |
diff --git a/src/dutil/deputil.cpp b/src/dutil/deputil.cpp index 362b3345..2e6d6a6c 100644 --- a/src/dutil/deputil.cpp +++ b/src/dutil/deputil.cpp | |||
@@ -122,9 +122,7 @@ DAPI_(HRESULT) DepCheckDependency( | |||
122 | LPWSTR sczKey = NULL; | 122 | LPWSTR sczKey = NULL; |
123 | HKEY hkKey = NULL; | 123 | HKEY hkKey = NULL; |
124 | DWORD64 dw64Version = 0; | 124 | DWORD64 dw64Version = 0; |
125 | int cchMinVersion = 0; | ||
126 | DWORD64 dw64MinVersion = 0; | 125 | DWORD64 dw64MinVersion = 0; |
127 | int cchMaxVersion = 0; | ||
128 | DWORD64 dw64MaxVersion = 0; | 126 | DWORD64 dw64MaxVersion = 0; |
129 | BOOL fAllowEqual = FALSE; | 127 | BOOL fAllowEqual = FALSE; |
130 | LPWSTR sczName = NULL; | 128 | LPWSTR sczName = NULL; |
@@ -171,10 +169,9 @@ DAPI_(HRESULT) DepCheckDependency( | |||
171 | // Check MinVersion if provided. | 169 | // Check MinVersion if provided. |
172 | if (wzMinVersion) | 170 | if (wzMinVersion) |
173 | { | 171 | { |
174 | cchMinVersion = lstrlenW(wzMinVersion); | 172 | if (*wzMinVersion) |
175 | if (0 < cchMinVersion) | ||
176 | { | 173 | { |
177 | hr = FileVersionFromStringEx(wzMinVersion, cchMinVersion, &dw64MinVersion); | 174 | hr = FileVersionFromStringEx(wzMinVersion, 0, &dw64MinVersion); |
178 | DepExitOnFailure(hr, "Failed to get the 64-bit version number from \"%ls\".", wzMinVersion); | 175 | DepExitOnFailure(hr, "Failed to get the 64-bit version number from \"%ls\".", wzMinVersion); |
179 | 176 | ||
180 | fAllowEqual = iAttributes & RequiresAttributesMinVersionInclusive; | 177 | fAllowEqual = iAttributes & RequiresAttributesMinVersionInclusive; |
@@ -206,10 +203,9 @@ DAPI_(HRESULT) DepCheckDependency( | |||
206 | // Check MaxVersion if provided. | 203 | // Check MaxVersion if provided. |
207 | if (wzMaxVersion) | 204 | if (wzMaxVersion) |
208 | { | 205 | { |
209 | cchMaxVersion = lstrlenW(wzMaxVersion); | 206 | if (*wzMaxVersion) |
210 | if (0 < cchMaxVersion) | ||
211 | { | 207 | { |
212 | hr = FileVersionFromStringEx(wzMaxVersion, cchMaxVersion, &dw64MaxVersion); | 208 | hr = FileVersionFromStringEx(wzMaxVersion, 0, &dw64MaxVersion); |
213 | DepExitOnFailure(hr, "Failed to get the 64-bit version number from \"%ls\".", wzMaxVersion); | 209 | DepExitOnFailure(hr, "Failed to get the 64-bit version number from \"%ls\".", wzMaxVersion); |
214 | 210 | ||
215 | fAllowEqual = iAttributes & RequiresAttributesMaxVersionInclusive; | 211 | fAllowEqual = iAttributes & RequiresAttributesMaxVersionInclusive; |
diff --git a/src/dutil/dirutil.cpp b/src/dutil/dirutil.cpp index b10e71f3..ae2c5e1c 100644 --- a/src/dutil/dirutil.cpp +++ b/src/dutil/dirutil.cpp | |||
@@ -400,7 +400,7 @@ extern "C" HRESULT DAPI DirGetCurrent( | |||
400 | DirExitOnFailure(hr, "Failed to determine size of current directory."); | 400 | DirExitOnFailure(hr, "Failed to determine size of current directory."); |
401 | } | 401 | } |
402 | 402 | ||
403 | DWORD cchRequired = ::GetCurrentDirectoryW(static_cast<DWORD>(cch), 0 == cch ? NULL : *psczCurrentDirectory); | 403 | DWORD cchRequired = ::GetCurrentDirectoryW((DWORD)min(DWORD_MAX, cch), 0 == cch ? NULL : *psczCurrentDirectory); |
404 | if (0 == cchRequired) | 404 | if (0 == cchRequired) |
405 | { | 405 | { |
406 | DirExitWithLastError(hr, "Failed to get current directory."); | 406 | DirExitWithLastError(hr, "Failed to get current directory."); |
diff --git a/src/dutil/dutil.cpp b/src/dutil/dutil.cpp index c500191a..56b85207 100644 --- a/src/dutil/dutil.cpp +++ b/src/dutil/dutil.cpp | |||
@@ -127,9 +127,13 @@ extern "C" void DAPI Dutil_AssertMsg( | |||
127 | hAssertFile = ::CreateFileA(szPath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | 127 | hAssertFile = ::CreateFileA(szPath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
128 | if (INVALID_HANDLE_VALUE != hAssertFile) | 128 | if (INVALID_HANDLE_VALUE != hAssertFile) |
129 | { | 129 | { |
130 | ::SetFilePointer(hAssertFile, 0, 0, FILE_END); | 130 | if (INVALID_SET_FILE_POINTER != ::SetFilePointer(hAssertFile, 0, 0, FILE_END)) |
131 | ::StringCchCatA(szMsg, countof(szMsg), "\r\n"); | 131 | { |
132 | ::WriteFile(hAssertFile, szMsg, lstrlenA(szMsg), &cch, NULL); | 132 | if (SUCCEEDED(::StringCchCatA(szMsg, countof(szMsg), "\r\n"))) |
133 | { | ||
134 | ::WriteFile(hAssertFile, szMsg, lstrlenA(szMsg), &cch, NULL); | ||
135 | } | ||
136 | } | ||
133 | } | 137 | } |
134 | } | 138 | } |
135 | } | 139 | } |
diff --git a/src/dutil/eseutil.cpp b/src/dutil/eseutil.cpp index d2bd7dc5..b9455d4b 100644 --- a/src/dutil/eseutil.cpp +++ b/src/dutil/eseutil.cpp | |||
@@ -312,12 +312,14 @@ HRESULT AllocIndexCreateStruct( | |||
312 | EseExitOnNull(*ppjicIndexCreate, hr, E_OUTOFMEMORY, "Failed to allocate index create structure for database"); | 312 | EseExitOnNull(*ppjicIndexCreate, hr, E_OUTOFMEMORY, "Failed to allocate index create structure for database"); |
313 | 313 | ||
314 | // Record the size including both null terminators - the struct requires this | 314 | // Record the size including both null terminators - the struct requires this |
315 | DWORD dwSize = 0; | 315 | size_t cchSize = 0; |
316 | dwSize = lstrlen(pszMultiSzKeys) + 1; // add 1 to include null character at the end | 316 | hr = ::StringCchLengthA(pszMultiSzKeys, STRSAFE_MAX_LENGTH, &cchSize); |
317 | EseExitOnFailure(hr, "Failed to get size of keys string"); | 317 | EseExitOnRootFailure(hr, "Failed to get size of keys string"); |
318 | |||
319 | ++cchSize; // add 1 to include null character at the end | ||
318 | 320 | ||
319 | // At this point convert all question marks to null characters | 321 | // At this point convert all question marks to null characters |
320 | for (i = 0; i < dwSize; ++i) | 322 | for (i = 0; i < cchSize; ++i) |
321 | { | 323 | { |
322 | if ('?' == pszMultiSzKeys[i]) | 324 | if ('?' == pszMultiSzKeys[i]) |
323 | { | 325 | { |
@@ -328,7 +330,7 @@ HRESULT AllocIndexCreateStruct( | |||
328 | (*ppjicIndexCreate)->cbStruct = sizeof(JET_INDEXCREATE); | 330 | (*ppjicIndexCreate)->cbStruct = sizeof(JET_INDEXCREATE); |
329 | (*ppjicIndexCreate)->szIndexName = pszIndexName; | 331 | (*ppjicIndexCreate)->szIndexName = pszIndexName; |
330 | (*ppjicIndexCreate)->szKey = pszMultiSzKeys; | 332 | (*ppjicIndexCreate)->szKey = pszMultiSzKeys; |
331 | (*ppjicIndexCreate)->cbKey = dwSize; | 333 | (*ppjicIndexCreate)->cbKey = (DWORD)cchSize; |
332 | (*ppjicIndexCreate)->grbit = JET_bitIndexUnique | JET_bitIndexPrimary; | 334 | (*ppjicIndexCreate)->grbit = JET_bitIndexUnique | JET_bitIndexPrimary; |
333 | (*ppjicIndexCreate)->ulDensity = 80; | 335 | (*ppjicIndexCreate)->ulDensity = 80; |
334 | (*ppjicIndexCreate)->lcid = 1033; | 336 | (*ppjicIndexCreate)->lcid = 1033; |
@@ -884,7 +886,16 @@ HRESULT DAPI EseSetColumnString( | |||
884 | { | 886 | { |
885 | HRESULT hr = S_OK; | 887 | HRESULT hr = S_OK; |
886 | JET_ERR jEr = JET_errSuccess; | 888 | JET_ERR jEr = JET_errSuccess; |
887 | ULONG cbValueSize = static_cast<ULONG>((wcslen(pwzValue) + 1) * sizeof(WCHAR)); // add 1 for null character, then multiply by size of WCHAR to get bytes | 889 | size_t cchValue = 0; |
890 | ULONG cbValueSize = 0; | ||
891 | |||
892 | if (pwzValue) | ||
893 | { | ||
894 | hr = ::StringCchLengthW(pwzValue, STRSAFE_MAX_LENGTH, &cchValue); | ||
895 | EseExitOnRootFailure(hr, "Failed to get string length: %ls", pwzValue); | ||
896 | } | ||
897 | |||
898 | cbValueSize = static_cast<ULONG>((cchValue + 1) * sizeof(WCHAR)); // add 1 for null character, then multiply by size of WCHAR to get bytes | ||
888 | 899 | ||
889 | jEr = JetSetColumn(jsSession, tsTable.jtTable, tsTable.pcsColumns[dwColumn].jcColumn, pwzValue, cbValueSize, 0, NULL); | 900 | jEr = JetSetColumn(jsSession, tsTable.jtTable, tsTable.pcsColumns[dwColumn].jcColumn, pwzValue, cbValueSize, 0, NULL); |
890 | ExitOnJetFailure(jEr, hr, "Failed to set string value into column of database: %ls", pwzValue); | 901 | ExitOnJetFailure(jEr, hr, "Failed to set string value into column of database: %ls", pwzValue); |
@@ -1196,11 +1207,17 @@ HRESULT DAPI EseSetQueryColumnString( | |||
1196 | { | 1207 | { |
1197 | HRESULT hr = S_OK; | 1208 | HRESULT hr = S_OK; |
1198 | DWORD dwStringSize = 0; | 1209 | DWORD dwStringSize = 0; |
1210 | size_t cchString = 0; | ||
1199 | ESE_QUERY *peqHandle = static_cast<ESE_QUERY *>(eqhHandle); | 1211 | ESE_QUERY *peqHandle = static_cast<ESE_QUERY *>(eqhHandle); |
1200 | JET_GRBIT jGrb = 0; | 1212 | JET_GRBIT jGrb = 0; |
1201 | 1213 | ||
1202 | dwStringSize = sizeof(WCHAR) * (lstrlenW(pszString) + 1); // Add 1 for null terminator | 1214 | if (pszString) |
1215 | { | ||
1216 | hr = ::StringCchLengthW(pszString, STRSAFE_MAX_LENGTH, &cchString); | ||
1217 | EseExitOnRootFailure(hr, "Failed to get size of column string"); | ||
1218 | } | ||
1203 | 1219 | ||
1220 | dwStringSize = static_cast<DWORD>(sizeof(WCHAR) * (cchString + 1)); // Add 1 for null terminator | ||
1204 | 1221 | ||
1205 | if (fFinal) | 1222 | if (fFinal) |
1206 | { | 1223 | { |
diff --git a/src/dutil/fileutil.cpp b/src/dutil/fileutil.cpp index 6cc2a80e..1822727a 100644 --- a/src/dutil/fileutil.cpp +++ b/src/dutil/fileutil.cpp | |||
@@ -155,40 +155,33 @@ __out LPWSTR *ppwzFileNameNoExtension | |||
155 | Assert(wzFileName && *wzFileName); | 155 | Assert(wzFileName && *wzFileName); |
156 | 156 | ||
157 | HRESULT hr = S_OK; | 157 | HRESULT hr = S_OK; |
158 | 158 | size_t cchFileName = 0; | |
159 | SIZE_T cchFileName = wcslen(wzFileName); | ||
160 | |||
161 | LPWSTR pwzFileNameNoExtension = NULL; | 159 | LPWSTR pwzFileNameNoExtension = NULL; |
162 | DWORD cchFileNameNoExtension = 0; | 160 | size_t cchFileNameNoExtension = 0; |
163 | 161 | errno_t err = 0; | |
164 | // Filename without extension can not be longer than _MAX_FNAME | 162 | |
165 | // Filename without extension should also not be longer than filename itself | 163 | hr = ::StringCchLengthW(wzFileName, STRSAFE_MAX_LENGTH, &cchFileName); |
166 | if (_MAX_FNAME > cchFileName) | 164 | FileExitOnRootFailure(hr, "failed to get length of file name: %ls", wzFileName); |
167 | { | 165 | |
168 | cchFileNameNoExtension = (DWORD) cchFileName; | 166 | cchFileNameNoExtension = cchFileName + 1; |
169 | } | 167 | |
170 | else | ||
171 | { | ||
172 | cchFileNameNoExtension = _MAX_FNAME; | ||
173 | } | ||
174 | |||
175 | hr = StrAlloc(&pwzFileNameNoExtension, cchFileNameNoExtension); | 168 | hr = StrAlloc(&pwzFileNameNoExtension, cchFileNameNoExtension); |
176 | FileExitOnFailure(hr, "failed to allocate space for File Name without extension"); | 169 | FileExitOnFailure(hr, "failed to allocate space for File Name without extension"); |
177 | 170 | ||
178 | // _wsplitpath_s can handle drive/path/filename/extension | 171 | // _wsplitpath_s can handle drive/path/filename/extension |
179 | errno_t err = _wsplitpath_s(wzFileName, NULL, NULL, NULL, NULL, pwzFileNameNoExtension, cchFileNameNoExtension, NULL, NULL); | 172 | err = _wsplitpath_s(wzFileName, NULL, NULL, NULL, NULL, pwzFileNameNoExtension, cchFileNameNoExtension, NULL, NULL); |
180 | if (0 != err) | 173 | if (err) |
181 | { | 174 | { |
182 | hr = E_INVALIDARG; | 175 | hr = E_INVALIDARG; |
183 | FileExitOnFailure(hr, "failed to parse filename: %ls", wzFileName); | 176 | FileExitOnRootFailure(hr, "failed to parse filename: '%ls', error: %d", wzFileName, err); |
184 | } | 177 | } |
185 | 178 | ||
186 | *ppwzFileNameNoExtension = pwzFileNameNoExtension; | 179 | *ppwzFileNameNoExtension = pwzFileNameNoExtension; |
187 | pwzFileNameNoExtension = NULL; | 180 | pwzFileNameNoExtension = NULL; |
188 | 181 | ||
189 | LExit: | 182 | LExit: |
190 | ReleaseStr(pwzFileNameNoExtension); | 183 | ReleaseStr(pwzFileNameNoExtension); |
191 | 184 | ||
192 | return hr; | 185 | return hr; |
193 | } | 186 | } |
194 | 187 | ||
@@ -237,8 +230,12 @@ extern "C" HRESULT DAPI FileAddSuffixToBaseName( | |||
237 | 230 | ||
238 | HRESULT hr = S_OK; | 231 | HRESULT hr = S_OK; |
239 | LPWSTR sczNewFileName = NULL; | 232 | LPWSTR sczNewFileName = NULL; |
233 | size_t cchFileName = 0; | ||
234 | |||
235 | hr = ::StringCchLengthW(wzFileName, STRSAFE_MAX_CCH, &cchFileName); | ||
236 | FileExitOnRootFailure(hr, "Failed to get length of file name: %ls", wzFileName); | ||
240 | 237 | ||
241 | LPCWSTR wzExtension = wzFileName + lstrlenW(wzFileName); | 238 | LPCWSTR wzExtension = wzFileName + cchFileName; |
242 | while (wzFileName < wzExtension && L'.' != *wzExtension) | 239 | while (wzFileName < wzExtension && L'.' != *wzExtension) |
243 | { | 240 | { |
244 | --wzExtension; | 241 | --wzExtension; |
@@ -410,7 +407,7 @@ LExit: | |||
410 | *******************************************************************/ | 407 | *******************************************************************/ |
411 | extern "C" HRESULT DAPI FileVersionFromStringEx( | 408 | extern "C" HRESULT DAPI FileVersionFromStringEx( |
412 | __in_z LPCWSTR wzVersion, | 409 | __in_z LPCWSTR wzVersion, |
413 | __in DWORD cchVersion, | 410 | __in SIZE_T cchVersion, |
414 | __out DWORD64* pqwVersion | 411 | __out DWORD64* pqwVersion |
415 | ) | 412 | ) |
416 | { | 413 | { |
@@ -428,7 +425,9 @@ extern "C" HRESULT DAPI FileVersionFromStringEx( | |||
428 | // get string length if not provided | 425 | // get string length if not provided |
429 | if (0 >= cchVersion) | 426 | if (0 >= cchVersion) |
430 | { | 427 | { |
431 | cchVersion = lstrlenW(wzVersion); | 428 | hr = ::StringCchLengthW(wzVersion, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchVersion)); |
429 | FileExitOnRootFailure(hr, "Failed to get length of file version string: %ls", wzVersion); | ||
430 | |||
432 | if (0 >= cchVersion) | 431 | if (0 >= cchVersion) |
433 | { | 432 | { |
434 | ExitFunction1(hr = E_INVALIDARG); | 433 | ExitFunction1(hr = E_INVALIDARG); |
@@ -996,6 +995,41 @@ LExit: | |||
996 | return hr; | 995 | return hr; |
997 | } | 996 | } |
998 | 997 | ||
998 | extern "C" HRESULT DAPI FileReadHandle( | ||
999 | __in HANDLE hFile, | ||
1000 | __in_bcount(cbDest) LPBYTE pbDest, | ||
1001 | __in SIZE_T cbDest | ||
1002 | ) | ||
1003 | { | ||
1004 | HRESULT hr = 0; | ||
1005 | DWORD cbDataRead = 0; | ||
1006 | SIZE_T cbRemaining = cbDest; | ||
1007 | SIZE_T cbTotal = 0; | ||
1008 | |||
1009 | while (0 < cbRemaining) | ||
1010 | { | ||
1011 | if (!::ReadFile(hFile, pbDest + cbTotal, (DWORD)min(DWORD_MAX, cbRemaining), &cbDataRead, NULL)) | ||
1012 | { | ||
1013 | DWORD er = ::GetLastError(); | ||
1014 | if (ERROR_MORE_DATA == er) | ||
1015 | { | ||
1016 | hr = S_OK; | ||
1017 | } | ||
1018 | else | ||
1019 | { | ||
1020 | hr = HRESULT_FROM_WIN32(er); | ||
1021 | } | ||
1022 | FileExitOnRootFailure(hr, "Failed to read data from file handle."); | ||
1023 | } | ||
1024 | |||
1025 | cbRemaining -= cbDataRead; | ||
1026 | cbTotal += cbDataRead; | ||
1027 | } | ||
1028 | |||
1029 | LExit: | ||
1030 | return hr; | ||
1031 | } | ||
1032 | |||
999 | 1033 | ||
1000 | /******************************************************************* | 1034 | /******************************************************************* |
1001 | FileWrite - write a file from memory | 1035 | FileWrite - write a file from memory |
@@ -1044,18 +1078,20 @@ extern "C" HRESULT DAPI FileWriteHandle( | |||
1044 | { | 1078 | { |
1045 | HRESULT hr = S_OK; | 1079 | HRESULT hr = S_OK; |
1046 | DWORD cbDataWritten = 0; | 1080 | DWORD cbDataWritten = 0; |
1047 | DWORD cbTotal = 0; | 1081 | SIZE_T cbTotal = 0; |
1082 | SIZE_T cbRemaining = cbData; | ||
1048 | 1083 | ||
1049 | // Write out all of the data. | 1084 | // Write out all of the data. |
1050 | do | 1085 | while (0 < cbRemaining) |
1051 | { | 1086 | { |
1052 | if (!::WriteFile(hFile, pbData + cbTotal, (DWORD)(cbData - cbTotal), &cbDataWritten, NULL)) | 1087 | if (!::WriteFile(hFile, pbData + cbTotal, (DWORD)min(DWORD_MAX, cbRemaining), &cbDataWritten, NULL)) |
1053 | { | 1088 | { |
1054 | FileExitOnLastError(hr, "Failed to write data to file handle."); | 1089 | FileExitOnLastError(hr, "Failed to write data to file handle."); |
1055 | } | 1090 | } |
1056 | 1091 | ||
1092 | cbRemaining -= cbDataWritten; | ||
1057 | cbTotal += cbDataWritten; | 1093 | cbTotal += cbDataWritten; |
1058 | } while (cbTotal < cbData); | 1094 | } |
1059 | 1095 | ||
1060 | LExit: | 1096 | LExit: |
1061 | return hr; | 1097 | return hr; |
@@ -1115,7 +1151,7 @@ extern "C" HRESULT DAPI FileCopyUsingHandlesWithProgress( | |||
1115 | __in DWORD64 cbCopy, | 1151 | __in DWORD64 cbCopy, |
1116 | __in_opt LPPROGRESS_ROUTINE lpProgressRoutine, | 1152 | __in_opt LPPROGRESS_ROUTINE lpProgressRoutine, |
1117 | __in_opt LPVOID lpData | 1153 | __in_opt LPVOID lpData |
1118 | ) | 1154 | ) |
1119 | { | 1155 | { |
1120 | HRESULT hr = S_OK; | 1156 | HRESULT hr = S_OK; |
1121 | DWORD64 cbTotalCopied = 0; | 1157 | DWORD64 cbTotalCopied = 0; |
@@ -1135,21 +1171,24 @@ extern "C" HRESULT DAPI FileCopyUsingHandlesWithProgress( | |||
1135 | liSourceSize.QuadPart = cbCopy; | 1171 | liSourceSize.QuadPart = cbCopy; |
1136 | } | 1172 | } |
1137 | 1173 | ||
1138 | dwResult = lpProgressRoutine(liSourceSize, liTotalCopied, liZero, liZero, 0, CALLBACK_STREAM_SWITCH, hSource, hTarget, lpData); | 1174 | if (lpProgressRoutine) |
1139 | switch (dwResult) | ||
1140 | { | 1175 | { |
1141 | case PROGRESS_CONTINUE: | 1176 | dwResult = lpProgressRoutine(liSourceSize, liTotalCopied, liZero, liZero, 0, CALLBACK_STREAM_SWITCH, hSource, hTarget, lpData); |
1142 | break; | 1177 | switch (dwResult) |
1178 | { | ||
1179 | case PROGRESS_CONTINUE: | ||
1180 | break; | ||
1143 | 1181 | ||
1144 | case PROGRESS_CANCEL: | 1182 | case PROGRESS_CANCEL: |
1145 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_REQUEST_ABORTED)); | 1183 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_REQUEST_ABORTED)); |
1146 | 1184 | ||
1147 | case PROGRESS_STOP: | 1185 | case PROGRESS_STOP: |
1148 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_REQUEST_ABORTED)); | 1186 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_REQUEST_ABORTED)); |
1149 | 1187 | ||
1150 | case PROGRESS_QUIET: | 1188 | case PROGRESS_QUIET: |
1151 | lpProgressRoutine = NULL; | 1189 | lpProgressRoutine = NULL; |
1152 | break; | 1190 | break; |
1191 | } | ||
1153 | } | 1192 | } |
1154 | 1193 | ||
1155 | // Set size of the target file. | 1194 | // Set size of the target file. |
@@ -1929,23 +1968,27 @@ extern "C" HRESULT DAPI FileFromString( | |||
1929 | LPSTR sczUtf8String = NULL; | 1968 | LPSTR sczUtf8String = NULL; |
1930 | BYTE *pbFullFileBuffer = NULL; | 1969 | BYTE *pbFullFileBuffer = NULL; |
1931 | const BYTE *pcbFullFileBuffer = NULL; | 1970 | const BYTE *pcbFullFileBuffer = NULL; |
1932 | DWORD cbFullFileBuffer = 0; | 1971 | SIZE_T cbFullFileBuffer = 0; |
1933 | DWORD cbStrLen = 0; | 1972 | SIZE_T cbStrLen = 0; |
1934 | 1973 | ||
1935 | switch (feEncoding) | 1974 | switch (feEncoding) |
1936 | { | 1975 | { |
1937 | case FILE_ENCODING_UTF8: | 1976 | case FILE_ENCODING_UTF8: |
1938 | hr = StrAnsiAllocString(&sczUtf8String, sczString, 0, CP_UTF8); | 1977 | hr = StrAnsiAllocString(&sczUtf8String, sczString, 0, CP_UTF8); |
1939 | FileExitOnFailure(hr, "Failed to convert string to UTF-8 to write UTF-8 file"); | 1978 | FileExitOnFailure(hr, "Failed to convert string to UTF-8 to write UTF-8 file"); |
1940 | 1979 | ||
1941 | cbFullFileBuffer = lstrlenA(sczUtf8String); | 1980 | hr = ::StringCchLengthA(sczUtf8String, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cbFullFileBuffer)); |
1981 | FileExitOnRootFailure(hr, "Failed to get length of UTF-8 string"); | ||
1982 | |||
1942 | pcbFullFileBuffer = reinterpret_cast<BYTE *>(sczUtf8String); | 1983 | pcbFullFileBuffer = reinterpret_cast<BYTE *>(sczUtf8String); |
1943 | break; | 1984 | break; |
1944 | case FILE_ENCODING_UTF8_WITH_BOM: | 1985 | case FILE_ENCODING_UTF8_WITH_BOM: |
1945 | hr = StrAnsiAllocString(&sczUtf8String, sczString, 0, CP_UTF8); | 1986 | hr = StrAnsiAllocString(&sczUtf8String, sczString, 0, CP_UTF8); |
1946 | FileExitOnFailure(hr, "Failed to convert string to UTF-8 to write UTF-8 file"); | 1987 | FileExitOnFailure(hr, "Failed to convert string to UTF-8 to write UTF-8 file"); |
1947 | 1988 | ||
1948 | cbStrLen = lstrlenA(sczUtf8String); | 1989 | hr = ::StringCchLengthA(sczUtf8String, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cbStrLen)); |
1990 | FileExitOnRootFailure(hr, "Failed to get length of UTF-8 string"); | ||
1991 | |||
1949 | cbFullFileBuffer = sizeof(UTF8BOM) + cbStrLen; | 1992 | cbFullFileBuffer = sizeof(UTF8BOM) + cbStrLen; |
1950 | 1993 | ||
1951 | pbFullFileBuffer = reinterpret_cast<BYTE *>(MemAlloc(cbFullFileBuffer, TRUE)); | 1994 | pbFullFileBuffer = reinterpret_cast<BYTE *>(MemAlloc(cbFullFileBuffer, TRUE)); |
@@ -1956,11 +1999,17 @@ extern "C" HRESULT DAPI FileFromString( | |||
1956 | pcbFullFileBuffer = pbFullFileBuffer; | 1999 | pcbFullFileBuffer = pbFullFileBuffer; |
1957 | break; | 2000 | break; |
1958 | case FILE_ENCODING_UTF16: | 2001 | case FILE_ENCODING_UTF16: |
1959 | cbFullFileBuffer = lstrlenW(sczString) * sizeof(WCHAR); | 2002 | hr = ::StringCchLengthW(sczString, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cbStrLen)); |
2003 | FileExitOnRootFailure(hr, "Failed to get length of string"); | ||
2004 | |||
2005 | cbFullFileBuffer = cbStrLen * sizeof(WCHAR); | ||
1960 | pcbFullFileBuffer = reinterpret_cast<const BYTE *>(sczString); | 2006 | pcbFullFileBuffer = reinterpret_cast<const BYTE *>(sczString); |
1961 | break; | 2007 | break; |
1962 | case FILE_ENCODING_UTF16_WITH_BOM: | 2008 | case FILE_ENCODING_UTF16_WITH_BOM: |
1963 | cbStrLen = lstrlenW(sczString) * sizeof(WCHAR); | 2009 | hr = ::StringCchLengthW(sczString, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cbStrLen)); |
2010 | FileExitOnRootFailure(hr, "Failed to get length of string"); | ||
2011 | |||
2012 | cbStrLen *= sizeof(WCHAR); | ||
1964 | cbFullFileBuffer = sizeof(UTF16BOM) + cbStrLen; | 2013 | cbFullFileBuffer = sizeof(UTF16BOM) + cbStrLen; |
1965 | 2014 | ||
1966 | pbFullFileBuffer = reinterpret_cast<BYTE *>(MemAlloc(cbFullFileBuffer, TRUE)); | 2015 | pbFullFileBuffer = reinterpret_cast<BYTE *>(MemAlloc(cbFullFileBuffer, TRUE)); |
diff --git a/src/dutil/inc/aclutil.h b/src/dutil/inc/aclutil.h index 144e4613..ac03f9a8 100644 --- a/src/dutil/inc/aclutil.h +++ b/src/dutil/inc/aclutil.h | |||
@@ -140,7 +140,7 @@ HRESULT DAPI AclAddAdminToSecurityDescriptor( | |||
140 | // Following code in acl2util.cpp due to dependency on crypt32.dll. | 140 | // Following code in acl2util.cpp due to dependency on crypt32.dll. |
141 | HRESULT DAPI AclCalculateServiceSidString( | 141 | HRESULT DAPI AclCalculateServiceSidString( |
142 | __in LPCWSTR wzServiceName, | 142 | __in LPCWSTR wzServiceName, |
143 | __in int cchServiceName, | 143 | __in SIZE_T cchServiceName, |
144 | __deref_out_z LPWSTR* psczSid | 144 | __deref_out_z LPWSTR* psczSid |
145 | ); | 145 | ); |
146 | HRESULT DAPI AclGetAccountSidStringEx( | 146 | HRESULT DAPI AclGetAccountSidStringEx( |
diff --git a/src/dutil/inc/buffutil.h b/src/dutil/inc/buffutil.h index 7509f76a..322209e6 100644 --- a/src/dutil/inc/buffutil.h +++ b/src/dutil/inc/buffutil.h | |||
@@ -57,7 +57,7 @@ HRESULT BuffReadStream( | |||
57 | HRESULT BuffWriteNumber( | 57 | HRESULT BuffWriteNumber( |
58 | __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, | 58 | __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, |
59 | __inout SIZE_T* piBuffer, | 59 | __inout SIZE_T* piBuffer, |
60 | __in DWORD_PTR dw | 60 | __in DWORD dw |
61 | ); | 61 | ); |
62 | HRESULT BuffWriteNumber64( | 62 | HRESULT BuffWriteNumber64( |
63 | __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, | 63 | __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, |
diff --git a/src/dutil/inc/fileutil.h b/src/dutil/inc/fileutil.h index 319c5508..d3e326f7 100644 --- a/src/dutil/inc/fileutil.h +++ b/src/dutil/inc/fileutil.h | |||
@@ -62,7 +62,7 @@ HRESULT DAPI FileVersionFromString( | |||
62 | ); | 62 | ); |
63 | HRESULT DAPI FileVersionFromStringEx( | 63 | HRESULT DAPI FileVersionFromStringEx( |
64 | __in_z LPCWSTR wzVersion, | 64 | __in_z LPCWSTR wzVersion, |
65 | __in DWORD cchVersion, | 65 | __in SIZE_T cchVersion, |
66 | __out DWORD64* pqwVersion | 66 | __out DWORD64* pqwVersion |
67 | ); | 67 | ); |
68 | HRESULT DAPI FileVersionToStringEx( | 68 | HRESULT DAPI FileVersionToStringEx( |
@@ -130,6 +130,11 @@ HRESULT DAPI FileReadPartialEx( | |||
130 | __in BOOL fPartialOK, | 130 | __in BOOL fPartialOK, |
131 | __in DWORD dwShareMode | 131 | __in DWORD dwShareMode |
132 | ); | 132 | ); |
133 | HRESULT DAPI FileReadHandle( | ||
134 | __in HANDLE hFile, | ||
135 | __in_bcount(cbDest) LPBYTE pbDest, | ||
136 | __in SIZE_T cbDest | ||
137 | ); | ||
133 | HRESULT DAPI FileWrite( | 138 | HRESULT DAPI FileWrite( |
134 | __in_z LPCWSTR pwzFileName, | 139 | __in_z LPCWSTR pwzFileName, |
135 | __in DWORD dwFlagsAndAttributes, | 140 | __in DWORD dwFlagsAndAttributes, |
diff --git a/src/dutil/inc/pathutil.h b/src/dutil/inc/pathutil.h index 719ee7d8..579b8454 100644 --- a/src/dutil/inc/pathutil.h +++ b/src/dutil/inc/pathutil.h | |||
@@ -178,6 +178,18 @@ DAPI_(HRESULT) PathConcat( | |||
178 | ); | 178 | ); |
179 | 179 | ||
180 | /******************************************************************* | 180 | /******************************************************************* |
181 | PathConcatCch - like .NET's Path.Combine, lets you build up a path | ||
182 | one piece -- file or directory -- at a time. | ||
183 | *******************************************************************/ | ||
184 | DAPI_(HRESULT) PathConcatCch( | ||
185 | __in_opt LPCWSTR wzPath1, | ||
186 | __in SIZE_T cchPath1, | ||
187 | __in_opt LPCWSTR wzPath2, | ||
188 | __in SIZE_T cchPath2, | ||
189 | __deref_out_z LPWSTR* psczCombined | ||
190 | ); | ||
191 | |||
192 | /******************************************************************* | ||
181 | PathEnsureQuoted - ensures that a path is quoted; optionally, | 193 | PathEnsureQuoted - ensures that a path is quoted; optionally, |
182 | this function also terminates a directory with a backslash | 194 | this function also terminates a directory with a backslash |
183 | if it is not already. | 195 | if it is not already. |
diff --git a/src/dutil/inc/strutil.h b/src/dutil/inc/strutil.h index cf8c751c..1cff9ab8 100644 --- a/src/dutil/inc/strutil.h +++ b/src/dutil/inc/strutil.h | |||
@@ -277,12 +277,12 @@ void DAPI StrStringToLower( | |||
277 | HRESULT DAPI StrAllocStringToUpperInvariant( | 277 | HRESULT DAPI StrAllocStringToUpperInvariant( |
278 | __deref_out_z LPWSTR* pscz, | 278 | __deref_out_z LPWSTR* pscz, |
279 | __in_z LPCWSTR wzSource, | 279 | __in_z LPCWSTR wzSource, |
280 | __in int cchSource | 280 | __in SIZE_T cchSource |
281 | ); | 281 | ); |
282 | HRESULT DAPI StrAllocStringToLowerInvariant( | 282 | HRESULT DAPI StrAllocStringToLowerInvariant( |
283 | __deref_out_z LPWSTR* pscz, | 283 | __deref_out_z LPWSTR* pscz, |
284 | __in_z LPCWSTR wzSource, | 284 | __in_z LPCWSTR wzSource, |
285 | __in int cchSource | 285 | __in SIZE_T cchSource |
286 | ); | 286 | ); |
287 | 287 | ||
288 | HRESULT DAPI StrArrayAllocString( | 288 | HRESULT DAPI StrArrayAllocString( |
diff --git a/src/dutil/inc/verutil.h b/src/dutil/inc/verutil.h index 3caa17e1..5247bb61 100644 --- a/src/dutil/inc/verutil.h +++ b/src/dutil/inc/verutil.h | |||
@@ -74,7 +74,7 @@ void DAPI VerFreeVersion( | |||
74 | *******************************************************************/ | 74 | *******************************************************************/ |
75 | HRESULT DAPI VerParseVersion( | 75 | HRESULT DAPI VerParseVersion( |
76 | __in_z LPCWSTR wzVersion, | 76 | __in_z LPCWSTR wzVersion, |
77 | __in DWORD cchVersion, | 77 | __in SIZE_T cchVersion, |
78 | __in BOOL fStrict, | 78 | __in BOOL fStrict, |
79 | __out VERUTIL_VERSION** ppVersion | 79 | __out VERUTIL_VERSION** ppVersion |
80 | ); | 80 | ); |
diff --git a/src/dutil/inetutil.cpp b/src/dutil/inetutil.cpp index f75849f6..8dace55f 100644 --- a/src/dutil/inetutil.cpp +++ b/src/dutil/inetutil.cpp | |||
@@ -86,7 +86,8 @@ extern "C" HRESULT DAPI InternetQueryInfoString( | |||
86 | ) | 86 | ) |
87 | { | 87 | { |
88 | HRESULT hr = S_OK; | 88 | HRESULT hr = S_OK; |
89 | DWORD_PTR cbValue = 0; | 89 | SIZE_T cbOriginal = 0; |
90 | DWORD cbValue = 0; | ||
90 | DWORD dwIndex = 0; | 91 | DWORD dwIndex = 0; |
91 | 92 | ||
92 | // If nothing was provided start off with some arbitrary size. | 93 | // If nothing was provided start off with some arbitrary size. |
@@ -96,10 +97,12 @@ extern "C" HRESULT DAPI InternetQueryInfoString( | |||
96 | InetExitOnFailure(hr, "Failed to allocate memory for value."); | 97 | InetExitOnFailure(hr, "Failed to allocate memory for value."); |
97 | } | 98 | } |
98 | 99 | ||
99 | hr = StrSize(*psczValue, &cbValue); | 100 | hr = StrSize(*psczValue, &cbOriginal); |
100 | InetExitOnFailure(hr, "Failed to get size of value."); | 101 | InetExitOnFailure(hr, "Failed to get size of value."); |
101 | 102 | ||
102 | if (!::HttpQueryInfoW(hRequest, dwInfo, static_cast<void*>(*psczValue), reinterpret_cast<DWORD*>(&cbValue), &dwIndex)) | 103 | cbValue = (DWORD)min(DWORD_MAX, cbOriginal); |
104 | |||
105 | if (!::HttpQueryInfoW(hRequest, dwInfo, static_cast<void*>(*psczValue), &cbValue, &dwIndex)) | ||
103 | { | 106 | { |
104 | DWORD er = ::GetLastError(); | 107 | DWORD er = ::GetLastError(); |
105 | if (ERROR_INSUFFICIENT_BUFFER == er) | 108 | if (ERROR_INSUFFICIENT_BUFFER == er) |
@@ -109,7 +112,7 @@ extern "C" HRESULT DAPI InternetQueryInfoString( | |||
109 | hr = StrAlloc(psczValue, cbValue / sizeof(WCHAR)); | 112 | hr = StrAlloc(psczValue, cbValue / sizeof(WCHAR)); |
110 | InetExitOnFailure(hr, "Failed to allocate value."); | 113 | InetExitOnFailure(hr, "Failed to allocate value."); |
111 | 114 | ||
112 | if (!::HttpQueryInfoW(hRequest, dwInfo, static_cast<void*>(*psczValue), reinterpret_cast<DWORD*>(&cbValue), &dwIndex)) | 115 | if (!::HttpQueryInfoW(hRequest, dwInfo, static_cast<void*>(*psczValue), &cbValue, &dwIndex)) |
113 | { | 116 | { |
114 | er = ::GetLastError(); | 117 | er = ::GetLastError(); |
115 | } | 118 | } |
diff --git a/src/dutil/logutil.cpp b/src/dutil/logutil.cpp index 35251274..ac68036a 100644 --- a/src/dutil/logutil.cpp +++ b/src/dutil/logutil.cpp | |||
@@ -776,11 +776,15 @@ extern "C" HRESULT LogStringWorkRaw( | |||
776 | Assert(szLogData && *szLogData); | 776 | Assert(szLogData && *szLogData); |
777 | 777 | ||
778 | HRESULT hr = S_OK; | 778 | HRESULT hr = S_OK; |
779 | size_t cchLogData = 0; | ||
779 | DWORD cbLogData = 0; | 780 | DWORD cbLogData = 0; |
780 | DWORD cbTotal = 0; | 781 | DWORD cbTotal = 0; |
781 | DWORD cbWrote = 0; | 782 | DWORD cbWrote = 0; |
782 | 783 | ||
783 | cbLogData = lstrlenA(szLogData); | 784 | hr = ::StringCchLengthA(szLogData, STRSAFE_MAX_CCH, &cchLogData); |
785 | LoguExitOnRootFailure(hr, "Failed to get length of raw string"); | ||
786 | |||
787 | cbLogData = (DWORD)cchLogData; | ||
784 | 788 | ||
785 | // If the log hasn't been initialized yet, store it in a buffer | 789 | // If the log hasn't been initialized yet, store it in a buffer |
786 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) | 790 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) |
diff --git a/src/dutil/metautil.cpp b/src/dutil/metautil.cpp index 109cd31e..f313fc1c 100644 --- a/src/dutil/metautil.cpp +++ b/src/dutil/metautil.cpp | |||
@@ -299,7 +299,14 @@ extern "C" HRESULT DAPI MetaGetValue( | |||
299 | MetaExitOnNull(pmr->pbMDData, hr, E_OUTOFMEMORY, "failed to allocate memory for metabase value"); | 299 | MetaExitOnNull(pmr->pbMDData, hr, E_OUTOFMEMORY, "failed to allocate memory for metabase value"); |
300 | } | 300 | } |
301 | else // set the size of the data to the actual size of the memory | 301 | else // set the size of the data to the actual size of the memory |
302 | pmr->dwMDDataLen = (DWORD)MemSize(pmr->pbMDData); | 302 | { |
303 | SIZE_T cb = MemSize(pmr->pbMDData); | ||
304 | if (cb > DWORD_MAX) | ||
305 | { | ||
306 | MetaExitOnRootFailure(hr = E_INVALIDSTATE, "metabase data is too large: %Iu", cb); | ||
307 | } | ||
308 | pmr->dwMDDataLen = (DWORD)cb; | ||
309 | } | ||
303 | 310 | ||
304 | hr = piMetabase->GetData(mhKey, wzKey, pmr, &cbRequired); | 311 | hr = piMetabase->GetData(mhKey, wzKey, pmr, &cbRequired); |
305 | if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr) | 312 | if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr) |
diff --git a/src/dutil/pathutil.cpp b/src/dutil/pathutil.cpp index 183849ac..7c3cfe06 100644 --- a/src/dutil/pathutil.cpp +++ b/src/dutil/pathutil.cpp | |||
@@ -181,7 +181,7 @@ DAPI_(HRESULT) PathGetDirectory( | |||
181 | ) | 181 | ) |
182 | { | 182 | { |
183 | HRESULT hr = S_OK; | 183 | HRESULT hr = S_OK; |
184 | DWORD cchDirectory = DWORD_MAX; | 184 | size_t cchDirectory = SIZE_T_MAX; |
185 | 185 | ||
186 | for (LPCWSTR wz = wzPath; *wz; ++wz) | 186 | for (LPCWSTR wz = wzPath; *wz; ++wz) |
187 | { | 187 | { |
@@ -191,11 +191,11 @@ DAPI_(HRESULT) PathGetDirectory( | |||
191 | // : => relative path from mapped root | 191 | // : => relative path from mapped root |
192 | if (L'\\' == *wz || L'/' == *wz || (L':' == *wz && wz == wzPath + 1)) | 192 | if (L'\\' == *wz || L'/' == *wz || (L':' == *wz && wz == wzPath + 1)) |
193 | { | 193 | { |
194 | cchDirectory = static_cast<DWORD>(wz - wzPath) + 1; | 194 | cchDirectory = static_cast<size_t>(wz - wzPath) + 1; |
195 | } | 195 | } |
196 | } | 196 | } |
197 | 197 | ||
198 | if (DWORD_MAX == cchDirectory) | 198 | if (SIZE_T_MAX == cchDirectory) |
199 | { | 199 | { |
200 | // we were given just a file name, so there's no directory available | 200 | // we were given just a file name, so there's no directory available |
201 | return S_FALSE; | 201 | return S_FALSE; |
@@ -233,7 +233,7 @@ DAPI_(HRESULT) PathGetParentPath( | |||
233 | 233 | ||
234 | if (wzParent) | 234 | if (wzParent) |
235 | { | 235 | { |
236 | DWORD cchPath = static_cast<DWORD>(wzParent - wzPath) + 1; | 236 | size_t cchPath = static_cast<size_t>(wzParent - wzPath) + 1; |
237 | 237 | ||
238 | hr = StrAllocString(psczParent, wzPath, cchPath); | 238 | hr = StrAllocString(psczParent, wzPath, cchPath); |
239 | PathExitOnFailure(hr, "Failed to copy directory."); | 239 | PathExitOnFailure(hr, "Failed to copy directory."); |
@@ -260,6 +260,7 @@ DAPI_(HRESULT) PathExpand( | |||
260 | DWORD cch = 0; | 260 | DWORD cch = 0; |
261 | LPWSTR sczExpandedPath = NULL; | 261 | LPWSTR sczExpandedPath = NULL; |
262 | DWORD cchExpandedPath = 0; | 262 | DWORD cchExpandedPath = 0; |
263 | SIZE_T cbSize = 0; | ||
263 | 264 | ||
264 | LPWSTR sczFullPath = NULL; | 265 | LPWSTR sczFullPath = NULL; |
265 | 266 | ||
@@ -305,8 +306,10 @@ DAPI_(HRESULT) PathExpand( | |||
305 | } | 306 | } |
306 | PathExitOnFailure(hr, "Failed to prefix long path after expanding environment variables."); | 307 | PathExitOnFailure(hr, "Failed to prefix long path after expanding environment variables."); |
307 | 308 | ||
308 | hr = StrMaxLength(sczExpandedPath, reinterpret_cast<DWORD_PTR *>(&cchExpandedPath)); | 309 | hr = StrMaxLength(sczExpandedPath, &cbSize); |
309 | PathExitOnFailure(hr, "Failed to get max length of expanded path."); | 310 | PathExitOnFailure(hr, "Failed to get max length of expanded path."); |
311 | |||
312 | cchExpandedPath = (DWORD)min(DWORD_MAX, cbSize); | ||
310 | } | 313 | } |
311 | } | 314 | } |
312 | 315 | ||
@@ -317,7 +320,7 @@ DAPI_(HRESULT) PathExpand( | |||
317 | { | 320 | { |
318 | LPWSTR wzFileName = NULL; | 321 | LPWSTR wzFileName = NULL; |
319 | LPCWSTR wzPath = sczExpandedPath ? sczExpandedPath : wzRelativePath; | 322 | LPCWSTR wzPath = sczExpandedPath ? sczExpandedPath : wzRelativePath; |
320 | DWORD cchFullPath = PATH_GOOD_ENOUGH < cchExpandedPath ? cchExpandedPath : PATH_GOOD_ENOUGH; | 323 | DWORD cchFullPath = max(PATH_GOOD_ENOUGH, cchExpandedPath); |
321 | 324 | ||
322 | hr = StrAlloc(&sczFullPath, cchFullPath); | 325 | hr = StrAlloc(&sczFullPath, cchFullPath); |
323 | PathExitOnFailure(hr, "Failed to allocate space for full path."); | 326 | PathExitOnFailure(hr, "Failed to allocate space for full path."); |
@@ -836,8 +839,7 @@ DAPI_(BOOL) PathIsAbsolute( | |||
836 | __in_z LPCWSTR wzPath | 839 | __in_z LPCWSTR wzPath |
837 | ) | 840 | ) |
838 | { | 841 | { |
839 | DWORD dwLength = lstrlenW(wzPath); | 842 | return wzPath && wzPath[0] && wzPath[1] && (wzPath[0] == L'\\') || (wzPath[1] == L':'); |
840 | return (1 < dwLength) && (wzPath[0] == L'\\') || (wzPath[1] == L':'); | ||
841 | } | 843 | } |
842 | 844 | ||
843 | 845 | ||
@@ -847,27 +849,39 @@ DAPI_(HRESULT) PathConcat( | |||
847 | __deref_out_z LPWSTR* psczCombined | 849 | __deref_out_z LPWSTR* psczCombined |
848 | ) | 850 | ) |
849 | { | 851 | { |
852 | return PathConcatCch(wzPath1, 0, wzPath2, 0, psczCombined); | ||
853 | } | ||
854 | |||
855 | |||
856 | DAPI_(HRESULT) PathConcatCch( | ||
857 | __in_opt LPCWSTR wzPath1, | ||
858 | __in SIZE_T cchPath1, | ||
859 | __in_opt LPCWSTR wzPath2, | ||
860 | __in SIZE_T cchPath2, | ||
861 | __deref_out_z LPWSTR* psczCombined | ||
862 | ) | ||
863 | { | ||
850 | HRESULT hr = S_OK; | 864 | HRESULT hr = S_OK; |
851 | 865 | ||
852 | if (!wzPath2 || !*wzPath2) | 866 | if (!wzPath2 || !*wzPath2) |
853 | { | 867 | { |
854 | hr = StrAllocString(psczCombined, wzPath1, 0); | 868 | hr = StrAllocString(psczCombined, wzPath1, cchPath1); |
855 | PathExitOnFailure(hr, "Failed to copy just path1 to output."); | 869 | PathExitOnFailure(hr, "Failed to copy just path1 to output."); |
856 | } | 870 | } |
857 | else if (!wzPath1 || !*wzPath1 || PathIsAbsolute(wzPath2)) | 871 | else if (!wzPath1 || !*wzPath1 || PathIsAbsolute(wzPath2)) |
858 | { | 872 | { |
859 | hr = StrAllocString(psczCombined, wzPath2, 0); | 873 | hr = StrAllocString(psczCombined, wzPath2, cchPath2); |
860 | PathExitOnFailure(hr, "Failed to copy just path2 to output."); | 874 | PathExitOnFailure(hr, "Failed to copy just path2 to output."); |
861 | } | 875 | } |
862 | else | 876 | else |
863 | { | 877 | { |
864 | hr = StrAllocString(psczCombined, wzPath1, 0); | 878 | hr = StrAllocString(psczCombined, wzPath1, cchPath1); |
865 | PathExitOnFailure(hr, "Failed to copy path1 to output."); | 879 | PathExitOnFailure(hr, "Failed to copy path1 to output."); |
866 | 880 | ||
867 | hr = PathBackslashTerminate(psczCombined); | 881 | hr = PathBackslashTerminate(psczCombined); |
868 | PathExitOnFailure(hr, "Failed to backslashify."); | 882 | PathExitOnFailure(hr, "Failed to backslashify."); |
869 | 883 | ||
870 | hr = StrAllocConcat(psczCombined, wzPath2, 0); | 884 | hr = StrAllocConcat(psczCombined, wzPath2, cchPath2); |
871 | PathExitOnFailure(hr, "Failed to append path2 to output."); | 885 | PathExitOnFailure(hr, "Failed to append path2 to output."); |
872 | } | 886 | } |
873 | 887 | ||
@@ -1001,15 +1015,25 @@ DAPI_(HRESULT) PathGetHierarchyArray( | |||
1001 | LPWSTR sczPathCopy = NULL; | 1015 | LPWSTR sczPathCopy = NULL; |
1002 | LPWSTR sczNewPathCopy = NULL; | 1016 | LPWSTR sczNewPathCopy = NULL; |
1003 | DWORD cArraySpacesNeeded = 0; | 1017 | DWORD cArraySpacesNeeded = 0; |
1018 | size_t cchPath = 0; | ||
1019 | |||
1020 | hr = ::StringCchLengthW(wzPath, STRSAFE_MAX_LENGTH, &cchPath); | ||
1021 | PathExitOnRootFailure(hr, "Failed to get string length of path: %ls", wzPath); | ||
1022 | |||
1023 | if (!cchPath) | ||
1024 | { | ||
1025 | ExitFunction1(hr = E_INVALIDARG); | ||
1026 | } | ||
1004 | 1027 | ||
1005 | for (int i = 0; i < lstrlenW(wzPath); ++i) | 1028 | for (size_t i = 0; i < cchPath; ++i) |
1006 | { | 1029 | { |
1007 | if (wzPath[i] == L'\\') | 1030 | if (wzPath[i] == L'\\') |
1008 | { | 1031 | { |
1009 | ++cArraySpacesNeeded; | 1032 | ++cArraySpacesNeeded; |
1010 | } | 1033 | } |
1011 | } | 1034 | } |
1012 | if (wzPath[lstrlenW(wzPath) - 1] != L'\\') | 1035 | |
1036 | if (wzPath[cchPath - 1] != L'\\') | ||
1013 | { | 1037 | { |
1014 | ++cArraySpacesNeeded; | 1038 | ++cArraySpacesNeeded; |
1015 | } | 1039 | } |
@@ -1034,10 +1058,12 @@ DAPI_(HRESULT) PathGetHierarchyArray( | |||
1034 | hr = StrAllocString((*prgsczPathArray) + cArraySpacesNeeded - 1 - i, sczPathCopy, 0); | 1058 | hr = StrAllocString((*prgsczPathArray) + cArraySpacesNeeded - 1 - i, sczPathCopy, 0); |
1035 | PathExitOnFailure(hr, "Failed to copy path"); | 1059 | PathExitOnFailure(hr, "Failed to copy path"); |
1036 | 1060 | ||
1061 | DWORD cchPathCopy = lstrlenW(sczPathCopy); | ||
1062 | |||
1037 | // If it ends in a backslash, it's a directory path, so cut off everything the last backslash before we get the directory portion of the path | 1063 | // If it ends in a backslash, it's a directory path, so cut off everything the last backslash before we get the directory portion of the path |
1038 | if (wzPath[lstrlenW(sczPathCopy) - 1] == L'\\') | 1064 | if (wzPath[cchPathCopy - 1] == L'\\') |
1039 | { | 1065 | { |
1040 | sczPathCopy[lstrlenW(sczPathCopy) - 1] = L'\0'; | 1066 | sczPathCopy[cchPathCopy - 1] = L'\0'; |
1041 | } | 1067 | } |
1042 | 1068 | ||
1043 | hr = PathGetDirectory(sczPathCopy, &sczNewPathCopy); | 1069 | hr = PathGetDirectory(sczPathCopy, &sczNewPathCopy); |
diff --git a/src/dutil/regutil.cpp b/src/dutil/regutil.cpp index afd2d089..cb617932 100644 --- a/src/dutil/regutil.cpp +++ b/src/dutil/regutil.cpp | |||
@@ -294,12 +294,15 @@ extern "C" HRESULT DAPI RegKeyEnum( | |||
294 | { | 294 | { |
295 | HRESULT hr = S_OK; | 295 | HRESULT hr = S_OK; |
296 | DWORD er = ERROR_SUCCESS; | 296 | DWORD er = ERROR_SUCCESS; |
297 | SIZE_T cb = 0; | ||
297 | DWORD cch = 0; | 298 | DWORD cch = 0; |
298 | 299 | ||
299 | if (psczKey && *psczKey) | 300 | if (psczKey && *psczKey) |
300 | { | 301 | { |
301 | hr = StrMaxLength(*psczKey, reinterpret_cast<DWORD_PTR*>(&cch)); | 302 | hr = StrMaxLength(*psczKey, &cb); |
302 | RegExitOnFailure(hr, "Failed to determine length of string."); | 303 | RegExitOnFailure(hr, "Failed to determine length of string."); |
304 | |||
305 | cch = (DWORD)min(DWORD_MAX, cb); | ||
303 | } | 306 | } |
304 | 307 | ||
305 | if (2 > cch) | 308 | if (2 > cch) |
@@ -462,6 +465,7 @@ extern "C" HRESULT DAPI RegReadString( | |||
462 | { | 465 | { |
463 | HRESULT hr = S_OK; | 466 | HRESULT hr = S_OK; |
464 | DWORD er = ERROR_SUCCESS; | 467 | DWORD er = ERROR_SUCCESS; |
468 | SIZE_T cbValue = 0; | ||
465 | DWORD cch = 0; | 469 | DWORD cch = 0; |
466 | DWORD cb = 0; | 470 | DWORD cb = 0; |
467 | DWORD dwType = 0; | 471 | DWORD dwType = 0; |
@@ -469,8 +473,10 @@ extern "C" HRESULT DAPI RegReadString( | |||
469 | 473 | ||
470 | if (psczValue && *psczValue) | 474 | if (psczValue && *psczValue) |
471 | { | 475 | { |
472 | hr = StrMaxLength(*psczValue, reinterpret_cast<DWORD_PTR*>(&cch)); | 476 | hr = StrMaxLength(*psczValue, &cbValue); |
473 | RegExitOnFailure(hr, "Failed to determine length of string."); | 477 | RegExitOnFailure(hr, "Failed to determine length of string."); |
478 | |||
479 | cch = (DWORD)min(DWORD_MAX, cbValue); | ||
474 | } | 480 | } |
475 | 481 | ||
476 | if (2 > cch) | 482 | if (2 > cch) |
@@ -1000,18 +1006,18 @@ static HRESULT WriteStringToRegistry( | |||
1000 | __in_z_opt LPCWSTR wzName, | 1006 | __in_z_opt LPCWSTR wzName, |
1001 | __in_z_opt LPCWSTR wzValue, | 1007 | __in_z_opt LPCWSTR wzValue, |
1002 | __in DWORD dwType | 1008 | __in DWORD dwType |
1003 | ) | 1009 | ) |
1004 | { | 1010 | { |
1005 | HRESULT hr = S_OK; | 1011 | HRESULT hr = S_OK; |
1006 | DWORD er = ERROR_SUCCESS; | 1012 | DWORD er = ERROR_SUCCESS; |
1007 | DWORD cbValue = 0; | 1013 | size_t cbValue = 0; |
1008 | 1014 | ||
1009 | if (wzValue) | 1015 | if (wzValue) |
1010 | { | 1016 | { |
1011 | hr = ::StringCbLengthW(wzValue, STRSAFE_MAX_CCH * sizeof(TCHAR), reinterpret_cast<size_t*>(&cbValue)); | 1017 | hr = ::StringCbLengthW(wzValue, STRSAFE_MAX_CCH * sizeof(TCHAR), &cbValue); |
1012 | RegExitOnFailure(hr, "Failed to determine length of registry value: %ls", wzName); | 1018 | RegExitOnFailure(hr, "Failed to determine length of registry value: %ls", wzName); |
1013 | 1019 | ||
1014 | er = vpfnRegSetValueExW(hk, wzName, 0, dwType, reinterpret_cast<const BYTE *>(wzValue), cbValue); | 1020 | er = vpfnRegSetValueExW(hk, wzName, 0, dwType, reinterpret_cast<const BYTE *>(wzValue), static_cast<DWORD>(cbValue)); |
1015 | RegExitOnWin32Error(er, hr, "Failed to set registry value: %ls", wzName); | 1021 | RegExitOnWin32Error(er, hr, "Failed to set registry value: %ls", wzName); |
1016 | } | 1022 | } |
1017 | else | 1023 | else |
diff --git a/src/dutil/reswutil.cpp b/src/dutil/reswutil.cpp index 42b49c55..e78de84a 100644 --- a/src/dutil/reswutil.cpp +++ b/src/dutil/reswutil.cpp | |||
@@ -288,13 +288,16 @@ static HRESULT StringBlockChangeString( | |||
288 | { | 288 | { |
289 | HRESULT hr = S_OK; | 289 | HRESULT hr = S_OK; |
290 | LPWSTR pwzData = NULL; | 290 | LPWSTR pwzData = NULL; |
291 | DWORD cchData = lstrlenW(szData); | 291 | size_t cchData = 0; |
292 | |||
293 | hr = ::StringCchLengthW(szData, STRSAFE_MAX_LENGTH, &cchData); | ||
294 | ReswExitOnRootFailure(hr, "Failed to get block string length."); | ||
292 | 295 | ||
293 | pwzData = static_cast<LPWSTR>(MemAlloc((cchData + 1) * sizeof(WCHAR), TRUE)); | 296 | pwzData = static_cast<LPWSTR>(MemAlloc((cchData + 1) * sizeof(WCHAR), TRUE)); |
294 | ReswExitOnNull(pwzData, hr, E_OUTOFMEMORY, "Failed to allocate new block string."); | 297 | ReswExitOnNull(pwzData, hr, E_OUTOFMEMORY, "Failed to allocate new block string."); |
295 | 298 | ||
296 | hr = ::StringCchCopyW(pwzData, cchData + 1, szData); | 299 | hr = ::StringCchCopyW(pwzData, cchData + 1, szData); |
297 | ReswExitOnFailure(hr, "Failed to copy new block string."); | 300 | ReswExitOnRootFailure(hr, "Failed to copy new block string."); |
298 | 301 | ||
299 | ReleaseNullMem(pStrBlock->rgwz[dwStringId]); | 302 | ReleaseNullMem(pStrBlock->rgwz[dwStringId]); |
300 | 303 | ||
diff --git a/src/dutil/strutil.cpp b/src/dutil/strutil.cpp index daa090c9..550d6169 100644 --- a/src/dutil/strutil.cpp +++ b/src/dutil/strutil.cpp | |||
@@ -46,7 +46,7 @@ static HRESULT AllocFormattedArgsHelper( | |||
46 | static HRESULT StrAllocStringMapInvariant( | 46 | static HRESULT StrAllocStringMapInvariant( |
47 | __deref_out_z LPWSTR* pscz, | 47 | __deref_out_z LPWSTR* pscz, |
48 | __in_z LPCWSTR wzSource, | 48 | __in_z LPCWSTR wzSource, |
49 | __in int cchSource, | 49 | __in SIZE_T cchSource, |
50 | __in DWORD dwMapFlags | 50 | __in DWORD dwMapFlags |
51 | ); | 51 | ); |
52 | 52 | ||
@@ -146,7 +146,7 @@ HRESULT DAPI StrTrimCapacity( | |||
146 | SIZE_T cchLen = 0; | 146 | SIZE_T cchLen = 0; |
147 | 147 | ||
148 | hr = ::StringCchLengthW(*ppwz, STRSAFE_MAX_CCH, reinterpret_cast<UINT_PTR*>(&cchLen)); | 148 | hr = ::StringCchLengthW(*ppwz, STRSAFE_MAX_CCH, reinterpret_cast<UINT_PTR*>(&cchLen)); |
149 | StrExitOnFailure(hr, "Failed to calculate length of string"); | 149 | StrExitOnRootFailure(hr, "Failed to calculate length of string"); |
150 | 150 | ||
151 | ++cchLen; // Add 1 for null-terminator | 151 | ++cchLen; // Add 1 for null-terminator |
152 | 152 | ||
@@ -170,7 +170,7 @@ HRESULT DAPI StrTrimWhitespace( | |||
170 | ) | 170 | ) |
171 | { | 171 | { |
172 | HRESULT hr = S_OK; | 172 | HRESULT hr = S_OK; |
173 | int i = 0; | 173 | size_t i = 0; |
174 | LPWSTR sczResult = NULL; | 174 | LPWSTR sczResult = NULL; |
175 | 175 | ||
176 | // Ignore beginning whitespace | 176 | // Ignore beginning whitespace |
@@ -179,7 +179,9 @@ HRESULT DAPI StrTrimWhitespace( | |||
179 | wzSource++; | 179 | wzSource++; |
180 | } | 180 | } |
181 | 181 | ||
182 | i = lstrlenW(wzSource); | 182 | hr = ::StringCchLengthW(wzSource, STRSAFE_MAX_CCH, &i); |
183 | StrExitOnRootFailure(hr, "Failed to get length of string"); | ||
184 | |||
183 | // Overwrite ending whitespace with null characters | 185 | // Overwrite ending whitespace with null characters |
184 | if (0 < i) | 186 | if (0 < i) |
185 | { | 187 | { |
@@ -291,7 +293,7 @@ HRESULT DAPI StrAnsiTrimWhitespace( | |||
291 | ) | 293 | ) |
292 | { | 294 | { |
293 | HRESULT hr = S_OK; | 295 | HRESULT hr = S_OK; |
294 | int i = 0; | 296 | size_t i = 0; |
295 | LPSTR sczResult = NULL; | 297 | LPSTR sczResult = NULL; |
296 | 298 | ||
297 | // Ignore beginning whitespace | 299 | // Ignore beginning whitespace |
@@ -300,7 +302,9 @@ HRESULT DAPI StrAnsiTrimWhitespace( | |||
300 | szSource++; | 302 | szSource++; |
301 | } | 303 | } |
302 | 304 | ||
303 | i = lstrlen(szSource); | 305 | hr = ::StringCchLengthA(szSource, STRSAFE_MAX_CCH, &i); |
306 | StrExitOnRootFailure(hr, "Failed to get length of string"); | ||
307 | |||
304 | // Overwrite ending whitespace with null characters | 308 | // Overwrite ending whitespace with null characters |
305 | if (0 < i) | 309 | if (0 < i) |
306 | { | 310 | { |
@@ -395,14 +399,15 @@ static HRESULT AllocStringHelper( | |||
395 | cch /= sizeof(WCHAR); //convert the count in bytes to count in characters | 399 | cch /= sizeof(WCHAR); //convert the count in bytes to count in characters |
396 | } | 400 | } |
397 | 401 | ||
398 | if (0 == cchSource) | 402 | if (0 == cchSource && wzSource) |
399 | { | 403 | { |
400 | cchSource = lstrlenW(wzSource); | 404 | hr = ::StringCchLengthW(wzSource, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchSource)); |
405 | StrExitOnRootFailure(hr, "failed to get length of source string"); | ||
401 | } | 406 | } |
402 | 407 | ||
403 | SIZE_T cchNeeded; | 408 | SIZE_T cchNeeded; |
404 | hr = ::ULongPtrAdd(cchSource, 1, &cchNeeded); // add one for the null terminator | 409 | hr = ::ULongPtrAdd(cchSource, 1, &cchNeeded); // add one for the null terminator |
405 | StrExitOnFailure(hr, "source string is too long"); | 410 | StrExitOnRootFailure(hr, "source string is too long"); |
406 | 411 | ||
407 | if (cch < cchNeeded) | 412 | if (cch < cchNeeded) |
408 | { | 413 | { |
@@ -604,19 +609,20 @@ HRESULT DAPI StrAnsiAllocStringAnsi( | |||
604 | if (-1 == cch) | 609 | if (-1 == cch) |
605 | { | 610 | { |
606 | hr = E_INVALIDARG; | 611 | hr = E_INVALIDARG; |
607 | StrExitOnFailure(hr, "failed to get size of destination string"); | 612 | StrExitOnRootFailure(hr, "failed to get size of destination string"); |
608 | } | 613 | } |
609 | cch /= sizeof(CHAR); //convert the count in bytes to count in characters | 614 | cch /= sizeof(CHAR); //convert the count in bytes to count in characters |
610 | } | 615 | } |
611 | 616 | ||
612 | if (0 == cchSource) | 617 | if (0 == cchSource && szSource) |
613 | { | 618 | { |
614 | cchSource = lstrlenA(szSource); | 619 | hr = ::StringCchLengthA(szSource, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchSource)); |
620 | StrExitOnRootFailure(hr, "failed to get length of source string"); | ||
615 | } | 621 | } |
616 | 622 | ||
617 | SIZE_T cchNeeded; | 623 | SIZE_T cchNeeded; |
618 | hr = ::ULongPtrAdd(cchSource, 1, &cchNeeded); // add one for the null terminator | 624 | hr = ::ULongPtrAdd(cchSource, 1, &cchNeeded); // add one for the null terminator |
619 | StrExitOnFailure(hr, "source string is too long"); | 625 | StrExitOnRootFailure(hr, "source string is too long"); |
620 | 626 | ||
621 | if (cch < cchNeeded) | 627 | if (cch < cchNeeded) |
622 | { | 628 | { |
@@ -1075,7 +1081,7 @@ static HRESULT AllocFormattedArgsHelper( | |||
1075 | SIZE_T cch = 0; | 1081 | SIZE_T cch = 0; |
1076 | LPWSTR pwzOriginal = NULL; | 1082 | LPWSTR pwzOriginal = NULL; |
1077 | SIZE_T cbOriginal = 0; | 1083 | SIZE_T cbOriginal = 0; |
1078 | SIZE_T cchOriginal = 0; | 1084 | size_t cchOriginal = 0; |
1079 | 1085 | ||
1080 | if (*ppwz) | 1086 | if (*ppwz) |
1081 | { | 1087 | { |
@@ -1083,11 +1089,13 @@ static HRESULT AllocFormattedArgsHelper( | |||
1083 | if (-1 == cbOriginal) | 1089 | if (-1 == cbOriginal) |
1084 | { | 1090 | { |
1085 | hr = E_INVALIDARG; | 1091 | hr = E_INVALIDARG; |
1086 | StrExitOnFailure(hr, "failed to get size of destination string"); | 1092 | StrExitOnRootFailure(hr, "failed to get size of destination string"); |
1087 | } | 1093 | } |
1088 | 1094 | ||
1089 | cch = cbOriginal / sizeof(WCHAR); //convert the count in bytes to count in characters | 1095 | cch = cbOriginal / sizeof(WCHAR); //convert the count in bytes to count in characters |
1090 | cchOriginal = lstrlenW(*ppwz); | 1096 | |
1097 | hr = ::StringCchLengthW(*ppwz, STRSAFE_MAX_CCH, &cchOriginal); | ||
1098 | StrExitOnRootFailure(hr, "failed to get length of original string"); | ||
1091 | } | 1099 | } |
1092 | 1100 | ||
1093 | if (0 == cch) // if there is no space in the string buffer | 1101 | if (0 == cch) // if there is no space in the string buffer |
@@ -1124,7 +1132,7 @@ static HRESULT AllocFormattedArgsHelper( | |||
1124 | hr = S_FALSE; | 1132 | hr = S_FALSE; |
1125 | } | 1133 | } |
1126 | } while (S_FALSE == hr); | 1134 | } while (S_FALSE == hr); |
1127 | StrExitOnFailure(hr, "failed to format string"); | 1135 | StrExitOnRootFailure(hr, "failed to format string"); |
1128 | 1136 | ||
1129 | LExit: | 1137 | LExit: |
1130 | if (pwzOriginal && fZeroOnRealloc) | 1138 | if (pwzOriginal && fZeroOnRealloc) |
@@ -1155,7 +1163,7 @@ extern "C" HRESULT DAPI StrAnsiAllocFormattedArgs( | |||
1155 | HRESULT hr = S_OK; | 1163 | HRESULT hr = S_OK; |
1156 | SIZE_T cch = *ppsz ? MemSize(*ppsz) / sizeof(CHAR) : 0; | 1164 | SIZE_T cch = *ppsz ? MemSize(*ppsz) / sizeof(CHAR) : 0; |
1157 | LPSTR pszOriginal = NULL; | 1165 | LPSTR pszOriginal = NULL; |
1158 | DWORD cchOriginal = 0; | 1166 | size_t cchOriginal = 0; |
1159 | 1167 | ||
1160 | if (*ppsz) | 1168 | if (*ppsz) |
1161 | { | 1169 | { |
@@ -1163,11 +1171,12 @@ extern "C" HRESULT DAPI StrAnsiAllocFormattedArgs( | |||
1163 | if (-1 == cch) | 1171 | if (-1 == cch) |
1164 | { | 1172 | { |
1165 | hr = E_INVALIDARG; | 1173 | hr = E_INVALIDARG; |
1166 | StrExitOnFailure(hr, "failed to get size of destination string"); | 1174 | StrExitOnRootFailure(hr, "failed to get size of destination string"); |
1167 | } | 1175 | } |
1168 | cch /= sizeof(CHAR); //convert the count in bytes to count in characters | 1176 | cch /= sizeof(CHAR); //convert the count in bytes to count in characters |
1169 | 1177 | ||
1170 | cchOriginal = lstrlenA(*ppsz); | 1178 | hr = ::StringCchLengthA(*ppsz, STRSAFE_MAX_CCH, &cchOriginal); |
1179 | StrExitOnRootFailure(hr, "failed to get length of original string"); | ||
1171 | } | 1180 | } |
1172 | 1181 | ||
1173 | if (0 == cch) // if there is no space in the string buffer | 1182 | if (0 == cch) // if there is no space in the string buffer |
@@ -1202,7 +1211,7 @@ extern "C" HRESULT DAPI StrAnsiAllocFormattedArgs( | |||
1202 | hr = S_FALSE; | 1211 | hr = S_FALSE; |
1203 | } | 1212 | } |
1204 | } while (S_FALSE == hr); | 1213 | } while (S_FALSE == hr); |
1205 | StrExitOnFailure(hr, "failed to format string"); | 1214 | StrExitOnRootFailure(hr, "failed to format string"); |
1206 | 1215 | ||
1207 | LExit: | 1216 | LExit: |
1208 | ReleaseStr(pszOriginal); | 1217 | ReleaseStr(pszOriginal); |
@@ -1375,6 +1384,8 @@ extern "C" HRESULT DAPI StrReplaceString( | |||
1375 | HRESULT hr = S_FALSE; | 1384 | HRESULT hr = S_FALSE; |
1376 | LPCWSTR wzSubLocation = NULL; | 1385 | LPCWSTR wzSubLocation = NULL; |
1377 | LPWSTR pwzBuffer = NULL; | 1386 | LPWSTR pwzBuffer = NULL; |
1387 | size_t cchOldSubString = 0; | ||
1388 | size_t cchNewSubString = 0; | ||
1378 | 1389 | ||
1379 | if (!*ppwzOriginal) | 1390 | if (!*ppwzOriginal) |
1380 | { | 1391 | { |
@@ -1387,8 +1398,20 @@ extern "C" HRESULT DAPI StrReplaceString( | |||
1387 | ExitFunction(); | 1398 | ExitFunction(); |
1388 | } | 1399 | } |
1389 | 1400 | ||
1401 | if (wzOldSubString) | ||
1402 | { | ||
1403 | hr = ::StringCchLengthW(wzOldSubString, STRSAFE_MAX_CCH, &cchOldSubString); | ||
1404 | StrExitOnRootFailure(hr, "Failed to get old string length."); | ||
1405 | } | ||
1406 | |||
1407 | if (wzNewSubString) | ||
1408 | { | ||
1409 | hr = ::StringCchLengthW(wzNewSubString, STRSAFE_MAX_CCH, &cchNewSubString); | ||
1410 | StrExitOnRootFailure(hr, "Failed to get new string length."); | ||
1411 | } | ||
1412 | |||
1390 | hr = ::PtrdiffTToDWord(wzSubLocation - *ppwzOriginal, pdwStartIndex); | 1413 | hr = ::PtrdiffTToDWord(wzSubLocation - *ppwzOriginal, pdwStartIndex); |
1391 | StrExitOnFailure(hr, "Failed to diff pointers."); | 1414 | StrExitOnRootFailure(hr, "Failed to diff pointers."); |
1392 | 1415 | ||
1393 | hr = StrAllocString(&pwzBuffer, *ppwzOriginal, wzSubLocation - *ppwzOriginal); | 1416 | hr = StrAllocString(&pwzBuffer, *ppwzOriginal, wzSubLocation - *ppwzOriginal); |
1394 | StrExitOnFailure(hr, "Failed to duplicate string."); | 1417 | StrExitOnFailure(hr, "Failed to duplicate string."); |
@@ -1398,14 +1421,14 @@ extern "C" HRESULT DAPI StrReplaceString( | |||
1398 | hr = StrAllocConcat(&pwzBuffer, wzNewSubString, 0); | 1421 | hr = StrAllocConcat(&pwzBuffer, wzNewSubString, 0); |
1399 | StrExitOnFailure(hr, "Failed to append new string."); | 1422 | StrExitOnFailure(hr, "Failed to append new string."); |
1400 | 1423 | ||
1401 | hr = StrAllocConcat(&pwzBuffer, wzSubLocation + wcslen(wzOldSubString), 0); | 1424 | hr = StrAllocConcat(&pwzBuffer, wzSubLocation + cchOldSubString, 0); |
1402 | StrExitOnFailure(hr, "Failed to append post string."); | 1425 | StrExitOnFailure(hr, "Failed to append post string."); |
1403 | 1426 | ||
1404 | hr = StrFree(*ppwzOriginal); | 1427 | hr = StrFree(*ppwzOriginal); |
1405 | StrExitOnFailure(hr, "Failed to free original string."); | 1428 | StrExitOnFailure(hr, "Failed to free original string."); |
1406 | 1429 | ||
1407 | *ppwzOriginal = pwzBuffer; | 1430 | *ppwzOriginal = pwzBuffer; |
1408 | *pdwStartIndex = *pdwStartIndex + static_cast<DWORD>(wcslen(wzNewSubString)); | 1431 | *pdwStartIndex = *pdwStartIndex + static_cast<DWORD>(cchNewSubString); |
1409 | hr = S_OK; | 1432 | hr = S_OK; |
1410 | 1433 | ||
1411 | LExit: | 1434 | LExit: |
@@ -1516,15 +1539,18 @@ extern "C" HRESULT DAPI StrHexDecode( | |||
1516 | Assert(wzSource && pbDest); | 1539 | Assert(wzSource && pbDest); |
1517 | 1540 | ||
1518 | HRESULT hr = S_OK; | 1541 | HRESULT hr = S_OK; |
1519 | DWORD cchSource = lstrlenW(wzSource); | 1542 | size_t cchSource = 0; |
1520 | DWORD i; | 1543 | size_t i = 0; |
1521 | BYTE b; | 1544 | BYTE b = 0; |
1545 | |||
1546 | hr = ::StringCchLengthW(wzSource, STRSAFE_MAX_CCH, &cchSource); | ||
1547 | StrExitOnRootFailure(hr, "Failed to get length of hex string: %ls", wzSource); | ||
1522 | 1548 | ||
1523 | Assert(0 == cchSource % 2); | 1549 | Assert(0 == cchSource % 2); |
1524 | if (cbDest < cchSource / 2) | 1550 | if (cbDest < cchSource / 2) |
1525 | { | 1551 | { |
1526 | hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); | 1552 | hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); |
1527 | StrExitOnRootFailure(hr, "Insufficient buffer to decode string '%ls' len: %u into %u bytes.", wzSource, cchSource, cbDest); | 1553 | StrExitOnRootFailure(hr, "Insufficient buffer to decode string '%ls' len: %Iu into %Iu bytes.", wzSource, cchSource, cbDest); |
1528 | } | 1554 | } |
1529 | 1555 | ||
1530 | for (i = 0; i < cchSource / 2; ++i) | 1556 | for (i = 0; i < cchSource / 2; ++i) |
@@ -1728,17 +1754,20 @@ extern "C" HRESULT DAPI StrAllocBase85Decode( | |||
1728 | ) | 1754 | ) |
1729 | { | 1755 | { |
1730 | HRESULT hr = S_OK; | 1756 | HRESULT hr = S_OK; |
1731 | SIZE_T cchSource = lstrlenW(wzSource); | 1757 | size_t cchSource = 0; |
1732 | DWORD_PTR i, n, k; | 1758 | DWORD_PTR i, n, k; |
1733 | 1759 | ||
1734 | BYTE* pbDest; | 1760 | BYTE* pbDest = 0; |
1735 | SIZE_T cbDest; | 1761 | SIZE_T cbDest = 0; |
1736 | 1762 | ||
1737 | if (!wzSource || !ppbDest || !pcbDest) | 1763 | if (!wzSource || !ppbDest || !pcbDest) |
1738 | { | 1764 | { |
1739 | return E_INVALIDARG; | 1765 | ExitFunction1(hr = E_INVALIDARG); |
1740 | } | 1766 | } |
1741 | 1767 | ||
1768 | hr = ::StringCchLengthW(wzSource, STRSAFE_MAX_CCH, &cchSource); | ||
1769 | StrExitOnRootFailure(hr, "failed to get length of base 85 string: %ls", wzSource); | ||
1770 | |||
1742 | // evaluate size of output and check it | 1771 | // evaluate size of output and check it |
1743 | k = cchSource / 5; | 1772 | k = cchSource / 5; |
1744 | cbDest = k << 2; | 1773 | cbDest = k << 2; |
@@ -1932,7 +1961,8 @@ extern "C" HRESULT DAPI MultiSzPrepend( | |||
1932 | StrExitOnFailure(hr, "failed to get length of multisz"); | 1961 | StrExitOnFailure(hr, "failed to get length of multisz"); |
1933 | } | 1962 | } |
1934 | 1963 | ||
1935 | cchInsert = lstrlenW(pwzInsert); | 1964 | hr = ::StringCchLengthW(pwzInsert, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchInsert)); |
1965 | StrExitOnRootFailure(hr, "failed to get length of insert string"); | ||
1936 | 1966 | ||
1937 | cchResult = cchInsert + cchMultiSz + 1; | 1967 | cchResult = cchInsert + cchMultiSz + 1; |
1938 | 1968 | ||
@@ -1942,7 +1972,7 @@ extern "C" HRESULT DAPI MultiSzPrepend( | |||
1942 | 1972 | ||
1943 | // Prepend | 1973 | // Prepend |
1944 | hr = ::StringCchCopyW(pwzResult, cchResult, pwzInsert); | 1974 | hr = ::StringCchCopyW(pwzResult, cchResult, pwzInsert); |
1945 | StrExitOnFailure(hr, "failed to copy prepend string: %ls", pwzInsert); | 1975 | StrExitOnRootFailure(hr, "failed to copy prepend string: %ls", pwzInsert); |
1946 | 1976 | ||
1947 | // If there was no MULTISZ, double null terminate our result, otherwise, copy the MULTISZ in | 1977 | // If there was no MULTISZ, double null terminate our result, otherwise, copy the MULTISZ in |
1948 | if (0 == cchMultiSz) | 1978 | if (0 == cchMultiSz) |
@@ -2207,9 +2237,12 @@ extern "C" HRESULT DAPI MultiSzInsertString( | |||
2207 | SIZE_T cchProgress = 0; | 2237 | SIZE_T cchProgress = 0; |
2208 | LPWSTR pwzResult = NULL; | 2238 | LPWSTR pwzResult = NULL; |
2209 | SIZE_T cchResult = 0; | 2239 | SIZE_T cchResult = 0; |
2210 | SIZE_T cchString = lstrlenW(pwzInsert); | 2240 | SIZE_T cchString = 0; |
2211 | SIZE_T cchMultiSz = 0; | 2241 | SIZE_T cchMultiSz = 0; |
2212 | 2242 | ||
2243 | hr = ::StringCchLengthW(pwzInsert, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchString)); | ||
2244 | StrExitOnRootFailure(hr, "failed to get length of insert string"); | ||
2245 | |||
2213 | if (pcchMultiSz && 0 != *pcchMultiSz) | 2246 | if (pcchMultiSz && 0 != *pcchMultiSz) |
2214 | { | 2247 | { |
2215 | cchMultiSz = *pcchMultiSz; | 2248 | cchMultiSz = *pcchMultiSz; |
@@ -2464,11 +2497,15 @@ extern "C" HRESULT DAPI StrStringToInt64( | |||
2464 | INT iSign = 1; | 2497 | INT iSign = 1; |
2465 | INT nDigit = 0; | 2498 | INT nDigit = 0; |
2466 | LARGE_INTEGER liValue = { }; | 2499 | LARGE_INTEGER liValue = { }; |
2500 | size_t cchString = 0; | ||
2467 | 2501 | ||
2468 | // get string length if not provided | 2502 | // get string length if not provided |
2469 | if (0 >= cchIn) | 2503 | if (0 >= cchIn) |
2470 | { | 2504 | { |
2471 | cchIn = lstrlenW(wzIn); | 2505 | hr = ::StringCchLengthW(wzIn, STRSAFE_MAX_CCH, &cchString); |
2506 | StrExitOnRootFailure(hr, "Failed to get length of string."); | ||
2507 | |||
2508 | cchIn = (DWORD)cchString; | ||
2472 | if (0 >= cchIn) | 2509 | if (0 >= cchIn) |
2473 | { | 2510 | { |
2474 | ExitFunction1(hr = E_INVALIDARG); | 2511 | ExitFunction1(hr = E_INVALIDARG); |
@@ -2524,11 +2561,15 @@ extern "C" HRESULT DAPI StrStringToUInt64( | |||
2524 | DWORD nDigit = 0; | 2561 | DWORD nDigit = 0; |
2525 | ULONGLONG ullValue = 0; | 2562 | ULONGLONG ullValue = 0; |
2526 | ULONGLONG ull = 0; | 2563 | ULONGLONG ull = 0; |
2564 | size_t cchString = 0; | ||
2527 | 2565 | ||
2528 | // get string length if not provided | 2566 | // get string length if not provided |
2529 | if (0 >= cchIn) | 2567 | if (0 >= cchIn) |
2530 | { | 2568 | { |
2531 | cchIn = lstrlenW(wzIn); | 2569 | hr = ::StringCchLengthW(wzIn, STRSAFE_MAX_CCH, &cchString); |
2570 | StrExitOnRootFailure(hr, "Failed to get length of string."); | ||
2571 | |||
2572 | cchIn = (DWORD)cchString; | ||
2532 | if (0 >= cchIn) | 2573 | if (0 >= cchIn) |
2533 | { | 2574 | { |
2534 | ExitFunction1(hr = E_INVALIDARG); | 2575 | ExitFunction1(hr = E_INVALIDARG); |
@@ -2588,7 +2629,7 @@ StrAllocStringToUpperInvariant - creates an upper-case copy of a string. | |||
2588 | extern "C" HRESULT DAPI StrAllocStringToUpperInvariant( | 2629 | extern "C" HRESULT DAPI StrAllocStringToUpperInvariant( |
2589 | __deref_out_z LPWSTR* pscz, | 2630 | __deref_out_z LPWSTR* pscz, |
2590 | __in_z LPCWSTR wzSource, | 2631 | __in_z LPCWSTR wzSource, |
2591 | __in int cchSource | 2632 | __in SIZE_T cchSource |
2592 | ) | 2633 | ) |
2593 | { | 2634 | { |
2594 | return StrAllocStringMapInvariant(pscz, wzSource, cchSource, LCMAP_UPPERCASE); | 2635 | return StrAllocStringMapInvariant(pscz, wzSource, cchSource, LCMAP_UPPERCASE); |
@@ -2601,7 +2642,7 @@ StrAllocStringToLowerInvariant - creates an lower-case copy of a string. | |||
2601 | extern "C" HRESULT DAPI StrAllocStringToLowerInvariant( | 2642 | extern "C" HRESULT DAPI StrAllocStringToLowerInvariant( |
2602 | __deref_out_z LPWSTR* pscz, | 2643 | __deref_out_z LPWSTR* pscz, |
2603 | __in_z LPCWSTR wzSource, | 2644 | __in_z LPCWSTR wzSource, |
2604 | __in int cchSource | 2645 | __in SIZE_T cchSource |
2605 | ) | 2646 | ) |
2606 | { | 2647 | { |
2607 | return StrAllocStringMapInvariant(pscz, wzSource, cchSource, LCMAP_LOWERCASE); | 2648 | return StrAllocStringMapInvariant(pscz, wzSource, cchSource, LCMAP_LOWERCASE); |
@@ -2704,7 +2745,7 @@ Note: Assumes source and destination buffers will be the same. | |||
2704 | static HRESULT StrAllocStringMapInvariant( | 2745 | static HRESULT StrAllocStringMapInvariant( |
2705 | __deref_out_z LPWSTR* pscz, | 2746 | __deref_out_z LPWSTR* pscz, |
2706 | __in_z LPCWSTR wzSource, | 2747 | __in_z LPCWSTR wzSource, |
2707 | __in int cchSource, | 2748 | __in SIZE_T cchSource, |
2708 | __in DWORD dwMapFlags | 2749 | __in DWORD dwMapFlags |
2709 | ) | 2750 | ) |
2710 | { | 2751 | { |
@@ -2718,11 +2759,15 @@ static HRESULT StrAllocStringMapInvariant( | |||
2718 | // Need the actual string size for LCMapString. This includes the null-terminator | 2759 | // Need the actual string size for LCMapString. This includes the null-terminator |
2719 | // but LCMapString doesn't care either way. | 2760 | // but LCMapString doesn't care either way. |
2720 | hr = ::StringCchLengthW(*pscz, INT_MAX, reinterpret_cast<size_t*>(&cchSource)); | 2761 | hr = ::StringCchLengthW(*pscz, INT_MAX, reinterpret_cast<size_t*>(&cchSource)); |
2721 | StrExitOnFailure(hr, "Failed to get the length of the string."); | 2762 | StrExitOnRootFailure(hr, "Failed to get the length of the string."); |
2763 | } | ||
2764 | else if (INT_MAX < cchSource) | ||
2765 | { | ||
2766 | StrExitOnRootFailure(hr = E_INVALIDARG, "Source string is too long: %Iu", cchSource); | ||
2722 | } | 2767 | } |
2723 | 2768 | ||
2724 | // Convert the copy of the string to upper or lower case in-place. | 2769 | // Convert the copy of the string to upper or lower case in-place. |
2725 | if (0 == ::LCMapStringW(LOCALE_INVARIANT, dwMapFlags, *pscz, cchSource, *pscz, cchSource)) | 2770 | if (0 == ::LCMapStringW(LOCALE_INVARIANT, dwMapFlags, *pscz, static_cast<int>(cchSource), *pscz, static_cast<int>(cchSource))) |
2726 | { | 2771 | { |
2727 | StrExitWithLastError(hr, "Failed to convert the string case."); | 2772 | StrExitWithLastError(hr, "Failed to convert the string case."); |
2728 | } | 2773 | } |
diff --git a/src/dutil/thmutil.cpp b/src/dutil/thmutil.cpp index d87e997d..d200a0ea 100644 --- a/src/dutil/thmutil.cpp +++ b/src/dutil/thmutil.cpp | |||
@@ -1519,13 +1519,16 @@ DAPI_(HRESULT) ThemeGetTextControl( | |||
1519 | { | 1519 | { |
1520 | HRESULT hr = S_OK; | 1520 | HRESULT hr = S_OK; |
1521 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1521 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); |
1522 | SIZE_T cbSize = 0; | ||
1522 | DWORD cchText = 0; | 1523 | DWORD cchText = 0; |
1523 | DWORD cchTextRead = 0; | 1524 | DWORD cchTextRead = 0; |
1524 | 1525 | ||
1525 | // Ensure the string has room for at least one character. | 1526 | // Ensure the string has room for at least one character. |
1526 | hr = StrMaxLength(*psczText, reinterpret_cast<DWORD_PTR*>(&cchText)); | 1527 | hr = StrMaxLength(*psczText, &cbSize); |
1527 | ThmExitOnFailure(hr, "Failed to get text buffer length."); | 1528 | ThmExitOnFailure(hr, "Failed to get text buffer length."); |
1528 | 1529 | ||
1530 | cchText = (DWORD)min(DWORD_MAX, cbSize); | ||
1531 | |||
1529 | if (!cchText) | 1532 | if (!cchText) |
1530 | { | 1533 | { |
1531 | cchText = GROW_WINDOW_TEXT; | 1534 | cchText = GROW_WINDOW_TEXT; |
diff --git a/src/dutil/verutil.cpp b/src/dutil/verutil.cpp index fdb5a10a..21626f94 100644 --- a/src/dutil/verutil.cpp +++ b/src/dutil/verutil.cpp | |||
@@ -244,7 +244,7 @@ DAPI_(void) VerFreeVersion( | |||
244 | 244 | ||
245 | DAPI_(HRESULT) VerParseVersion( | 245 | DAPI_(HRESULT) VerParseVersion( |
246 | __in_z LPCWSTR wzVersion, | 246 | __in_z LPCWSTR wzVersion, |
247 | __in DWORD cchVersion, | 247 | __in SIZE_T cchVersion, |
248 | __in BOOL fStrict, | 248 | __in BOOL fStrict, |
249 | __out VERUTIL_VERSION** ppVersion | 249 | __out VERUTIL_VERSION** ppVersion |
250 | ) | 250 | ) |
@@ -267,9 +267,14 @@ DAPI_(HRESULT) VerParseVersion( | |||
267 | } | 267 | } |
268 | 268 | ||
269 | // Get string length if not provided. | 269 | // Get string length if not provided. |
270 | if (0 == cchVersion) | 270 | if (!cchVersion) |
271 | { | 271 | { |
272 | cchVersion = lstrlenW(wzVersion); | 272 | hr = ::StringCchLengthW(wzVersion, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cchVersion)); |
273 | VerExitOnRootFailure(hr, "Failed to get length of version string: %ls", wzVersion); | ||
274 | } | ||
275 | else if (INT_MAX < cchVersion) | ||
276 | { | ||
277 | VerExitOnRootFailure(hr = E_INVALIDARG, "Version string is too long: %Iu", cchVersion); | ||
273 | } | 278 | } |
274 | 279 | ||
275 | if (L'v' == *wzVersion || L'V' == *wzVersion) | 280 | if (L'v' == *wzVersion || L'V' == *wzVersion) |
diff --git a/src/dutil/xmlutil.cpp b/src/dutil/xmlutil.cpp index 6ecd2449..0f1e611d 100644 --- a/src/dutil/xmlutil.cpp +++ b/src/dutil/xmlutil.cpp | |||
@@ -1305,7 +1305,7 @@ extern "C" HRESULT DAPI XmlSaveDocumentToBuffer( | |||
1305 | XmlExitOnFailure(hr, "Failed to get stream size."); | 1305 | XmlExitOnFailure(hr, "Failed to get stream size."); |
1306 | 1306 | ||
1307 | // allocate buffer | 1307 | // allocate buffer |
1308 | pbDest = static_cast<BYTE*>(MemAlloc((SIZE_T)statstg.cbSize.LowPart, TRUE)); | 1308 | pbDest = static_cast<BYTE*>(MemAlloc(statstg.cbSize.LowPart, TRUE)); |
1309 | XmlExitOnNull(pbDest, hr, E_OUTOFMEMORY, "Failed to allocate destination buffer."); | 1309 | XmlExitOnNull(pbDest, hr, E_OUTOFMEMORY, "Failed to allocate destination buffer."); |
1310 | 1310 | ||
1311 | // read data from stream | 1311 | // read data from stream |
diff --git a/src/test/DUtilUnitTest/FileUtilTest.cpp b/src/test/DUtilUnitTest/FileUtilTest.cpp index 0087a1d5..ac071ef2 100644 --- a/src/test/DUtilUnitTest/FileUtilTest.cpp +++ b/src/test/DUtilUnitTest/FileUtilTest.cpp | |||
@@ -50,7 +50,7 @@ namespace DutilTests | |||
50 | } | 50 | } |
51 | 51 | ||
52 | private: | 52 | private: |
53 | void TestFile(LPWSTR wzDir, LPCWSTR wzTempDir, LPWSTR wzFileName, DWORD dwExpectedStringLength, FILE_ENCODING feExpectedEncoding) | 53 | void TestFile(LPWSTR wzDir, LPCWSTR wzTempDir, LPWSTR wzFileName, size_t cbExpectedStringLength, FILE_ENCODING feExpectedEncoding) |
54 | { | 54 | { |
55 | HRESULT hr = S_OK; | 55 | HRESULT hr = S_OK; |
56 | LPWSTR sczFullPath = NULL; | 56 | LPWSTR sczFullPath = NULL; |
@@ -61,6 +61,7 @@ namespace DutilTests | |||
61 | DWORD cbFile1 = 0; | 61 | DWORD cbFile1 = 0; |
62 | BYTE *pbFile2 = NULL; | 62 | BYTE *pbFile2 = NULL; |
63 | DWORD cbFile2 = 0; | 63 | DWORD cbFile2 = 0; |
64 | size_t cbActualStringLength = 0; | ||
64 | 65 | ||
65 | try | 66 | try |
66 | { | 67 | { |
@@ -77,10 +78,13 @@ namespace DutilTests | |||
77 | NativeAssert::Succeeded(hr, "FileToString() returned NULL for file: {0}", sczFullPath); | 78 | NativeAssert::Succeeded(hr, "FileToString() returned NULL for file: {0}", sczFullPath); |
78 | } | 79 | } |
79 | 80 | ||
80 | if ((DWORD)lstrlenW(sczContents) != dwExpectedStringLength) | 81 | hr = ::StringCchLengthW(sczContents, STRSAFE_MAX_CCH, &cbActualStringLength); |
82 | NativeAssert::Succeeded(hr, "Failed to get length of text from file: {0}", sczFullPath); | ||
83 | |||
84 | if (cbActualStringLength != cbExpectedStringLength) | ||
81 | { | 85 | { |
82 | hr = E_FAIL; | 86 | hr = E_FAIL; |
83 | ExitOnFailure(hr, "FileToString() returned wrong size for file: %ls (expected size %u, found size %u)", sczFullPath, dwExpectedStringLength, lstrlenW(sczContents)); | 87 | ExitOnFailure(hr, "FileToString() returned wrong size for file: %ls (expected size %Iu, found size %Iu)", sczFullPath, cbExpectedStringLength, cbActualStringLength); |
84 | } | 88 | } |
85 | 89 | ||
86 | if (feEncodingFound != feExpectedEncoding) | 90 | if (feEncodingFound != feExpectedEncoding) |