about summary refs log tree commit diff
diff options
context:
space:
mode:
authorname1e5s <name1e5s@qq.com>2022-03-19 22:05:56 +0800
committername1e5s <name1e5s@qq.com>2022-05-08 22:15:26 +0800
commitb87dd755ca8dd89ebb47a6f23c1c0fb656fe4d54 (patch)
tree8312cf1ac6bb2bb2d115e7af6c91f20263188e5e
parent8fbd92d0b95d847c68948d8dbbfaccb470db4f92 (diff)
downloadrust-b87dd755ca8dd89ebb47a6f23c1c0fb656fe4d54.tar.gz
rust-b87dd755ca8dd89ebb47a6f23c1c0fb656fe4d54.zip
fix panic in Path::strip_prefix
-rw-r--r--library/std/src/path.rs2
-rw-r--r--library/std/src/sys/windows/path/tests.rs12
2 files changed, 13 insertions, 1 deletions
diff --git a/library/std/src/path.rs b/library/std/src/path.rs
index c03d197e019..36d6469c02d 100644
--- a/library/std/src/path.rs
+++ b/library/std/src/path.rs
@@ -725,7 +725,7 @@ impl<'a> Components<'a> {
         if self.has_root() {
             return false;
         }
-        let mut iter = self.path[self.prefix_len()..].iter();
+        let mut iter = self.path[self.prefix_remaining()..].iter();
         match (iter.next(), iter.next()) {
             (Some(&b'.'), None) => true,
             (Some(&b'.'), Some(&b)) => self.is_sep_byte(b),
diff --git a/library/std/src/sys/windows/path/tests.rs b/library/std/src/sys/windows/path/tests.rs
index 8656b04e4f4..2f7ec433bf2 100644
--- a/library/std/src/sys/windows/path/tests.rs
+++ b/library/std/src/sys/windows/path/tests.rs
@@ -114,3 +114,15 @@ fn test_parse_prefix_verbatim_device() {
     assert_eq!(prefix, parse_prefix(r"/\?\C:\windows\system32\notepad.exe"));
     assert_eq!(prefix, parse_prefix(r"\\?/C:\windows\system32\notepad.exe"));
 }
+
+// See #93586 for more infomation.
+#[test]
+fn test_windows_prefix_components() {
+    use crate::path::Path;
+
+    let path = Path::new("C:");
+    let mut components = path.components();
+    let drive = components.next().expect("drive is expected here");
+    assert_eq!(drive.as_os_str(), OsStr::new("C:"));
+    assert_eq!(components.as_path(), Path::new(""));
+}