From b87dd755ca8dd89ebb47a6f23c1c0fb656fe4d54 Mon Sep 17 00:00:00 2001 From: name1e5s Date: Sat, 19 Mar 2022 22:05:56 +0800 Subject: [PATCH] fix panic in Path::strip_prefix --- library/std/src/path.rs | 2 +- library/std/src/sys/windows/path/tests.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/library/std/src/path.rs b/library/std/src/path.rs index c03d197e0194c..36d6469c02d31 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 8656b04e4f410..2f7ec433bf261 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("")); +}