[PATCH] D83689: [Support] Fix Windows directory_iterator_construct out of bounds
Andrew Ng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 15 02:19:42 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf6eb5daa1636: [Support] Fix Windows directory_iterator_construct out of bounds (authored by andrewng).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D83689/new/
https://reviews.llvm.org/D83689
Files:
llvm/lib/Support/Windows/Path.inc
llvm/unittests/Support/Path.cpp
Index: llvm/unittests/Support/Path.cpp
===================================================================
--- llvm/unittests/Support/Path.cpp
+++ llvm/unittests/Support/Path.cpp
@@ -1149,6 +1149,39 @@
}
#endif
+#ifdef _WIN32
+TEST_F(FileSystemTest, UTF8ToUTF16DirectoryIteration) {
+ // The Windows filesystem support uses UTF-16 and converts paths from the
+ // input UTF-8. The UTF-16 equivalent of the input path can be shorter in
+ // length.
+
+ // This test relies on TestDirectory not being so long such that MAX_PATH
+ // would be exceeded (see widenPath). If that were the case, the UTF-16
+ // path is likely to be longer than the input.
+ const char *Pi = "\xcf\x80"; // UTF-8 lower case pi.
+ std::string RootDir = (TestDirectory + "/" + Pi).str();
+
+ // Create test directories.
+ ASSERT_NO_ERROR(fs::create_directories(Twine(RootDir) + "/a"));
+ ASSERT_NO_ERROR(fs::create_directories(Twine(RootDir) + "/b"));
+
+ std::error_code EC;
+ unsigned Count = 0;
+ for (fs::directory_iterator I(Twine(RootDir), EC), E; I != E;
+ I.increment(EC)) {
+ ASSERT_NO_ERROR(EC);
+ StringRef DirName = path::filename(I->path());
+ EXPECT_TRUE(DirName == "a" || DirName == "b");
+ ++Count;
+ }
+ EXPECT_EQ(Count, 2U);
+
+ ASSERT_NO_ERROR(fs::remove(Twine(RootDir) + "/a"));
+ ASSERT_NO_ERROR(fs::remove(Twine(RootDir) + "/b"));
+ ASSERT_NO_ERROR(fs::remove(Twine(RootDir)));
+}
+#endif
+
TEST_F(FileSystemTest, Remove) {
SmallString<64> BaseDir;
SmallString<64> Paths[4];
Index: llvm/lib/Support/Windows/Path.inc
===================================================================
--- llvm/lib/Support/Windows/Path.inc
+++ llvm/lib/Support/Windows/Path.inc
@@ -957,9 +957,9 @@
return EC;
// Convert path to the format that Windows is happy with.
- if (PathUTF16.size() > 0 &&
- !is_separator(PathUTF16[Path.size() - 1]) &&
- PathUTF16[Path.size() - 1] != L':') {
+ size_t PathUTF16Len = PathUTF16.size();
+ if (PathUTF16Len > 0 && !is_separator(PathUTF16[PathUTF16Len - 1]) &&
+ PathUTF16[PathUTF16Len - 1] != L':') {
PathUTF16.push_back(L'\\');
PathUTF16.push_back(L'*');
} else {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83689.278114.patch
Type: text/x-patch
Size: 2170 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200715/e0b0806e/attachment.bin>
More information about the llvm-commits
mailing list