[llvm] [Path] Dix off-by-one in finding filename for win style paths (PR #78055)
Matheus Izvekov via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 13 10:06:15 PST 2024
https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/78055
This fixes a crash where `path::parent_path` causes an invalid access on a string upon receiving a path that consists of a single colon.
On Windows machine, with runtime checks enabled build, upon `clang -I: test.cc` produces:
```
Assertion failed: Index < Length && "Invalid index!", file llvm\include\llvm/ADT/StringRef.h, line 232
...
#6 0x00007ff7816201eb `anonymous namespace'::parent_path_end llvm\lib\Support\Path.cpp:144:0
#7 0x00007ff781620135 llvm::sys::path::parent_path(class llvm::StringRef, enum llvm::sys::path::Style) llvm\lib\Support\Path.cpp:470:0
```
Ideally, we can look for the last colon starting from the last character, but we can instead start from second to last, and handle empty paths by abusing `0 - 1 == npos`.
>From bcf9f9283bb112f416fd3c22207260510c38b883 Mon Sep 17 00:00:00 2001
From: Matheus Izvekov <mizvekov at gmail.com>
Date: Sat, 13 Jan 2024 14:02:50 -0300
Subject: [PATCH] [Path] Dix off-by-one in finding filename for win style paths
This fixes a crash where `path::parent_path` causes an invalid
access on a string upon receiving a path that consists of a single colon.
On Windows machine, with runtime checks enabled build, upon `clang -I: test.cc` produces:
```
Assertion failed: Index < Length && "Invalid index!", file llvm\include\llvm/ADT/StringRef.h, line 232
...
#6 0x00007ff7816201eb `anonymous namespace'::parent_path_end llvm\lib\Support\Path.cpp:144:0
#7 0x00007ff781620135 llvm::sys::path::parent_path(class llvm::StringRef, enum llvm::sys::path::Style) llvm\lib\Support\Path.cpp:470:0
```
Ideally, we can look for the last colon starting from the last
character, but we can instead start from second to last, and handle
empty paths by abusing `0 - 1 == npos`.
---
llvm/lib/Support/Path.cpp | 2 +-
llvm/unittests/Support/Path.cpp | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Support/Path.cpp b/llvm/lib/Support/Path.cpp
index c2456dcac0974a..1c441100679ed7 100644
--- a/llvm/lib/Support/Path.cpp
+++ b/llvm/lib/Support/Path.cpp
@@ -104,7 +104,7 @@ namespace {
if (is_style_windows(style)) {
if (pos == StringRef::npos)
- pos = str.find_last_of(':', str.size() - 2);
+ pos = str.find_last_of(':', str.size() - 1);
}
if (pos == StringRef::npos || (pos == 1 && is_separator(str[0], style)))
diff --git a/llvm/unittests/Support/Path.cpp b/llvm/unittests/Support/Path.cpp
index a7b7e6a0f5044d..837ca03216f87a 100644
--- a/llvm/unittests/Support/Path.cpp
+++ b/llvm/unittests/Support/Path.cpp
@@ -190,6 +190,7 @@ TEST(Support, Path) {
paths.push_back("c:\\foo\\");
paths.push_back("c:\\foo/");
paths.push_back("c:/foo\\bar");
+ paths.push_back(":");
for (SmallVector<StringRef, 40>::const_iterator i = paths.begin(),
e = paths.end();
More information about the llvm-commits
mailing list