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 /src/dutil/pathutil.cpp | |
parent | d73c29407fe5ec6a0207af7d9c2547457ae0854c (diff) | |
download | wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.tar.gz wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.tar.bz2 wix-bcd3ee7ab858d62beb36af9f5986544b68a3dd35.zip |
Clean up more 32-bit assumptions.
Diffstat (limited to 'src/dutil/pathutil.cpp')
-rw-r--r-- | src/dutil/pathutil.cpp | 58 |
1 files changed, 42 insertions, 16 deletions
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); |