diff options
| author | Chris Denton <christophersdenton@gmail.com> | 2021-10-23 19:34:09 +0100 |
|---|---|---|
| committer | Chris Denton <christophersdenton@gmail.com> | 2021-10-23 19:35:24 +0100 |
| commit | f1efc7efb2bc39021eb93228b1e25c384767b38d (patch) | |
| tree | d55a1d283fcd28efd5358b1566b8b16a4309eb30 /library/std/src/sys | |
| parent | 3e2d60624162845238fa3b2fbb874eee51daa983 (diff) | |
| download | rust-f1efc7efb2bc39021eb93228b1e25c384767b38d.tar.gz rust-f1efc7efb2bc39021eb93228b1e25c384767b38d.zip | |
Make sure `CreateDirectoryW` works for path lengths > 247
Diffstat (limited to 'library/std/src/sys')
| -rw-r--r-- | library/std/src/sys/windows/path.rs | 6 | ||||
| -rw-r--r-- | library/std/src/sys/windows/path/tests.rs | 7 |
2 files changed, 12 insertions, 1 deletions
diff --git a/library/std/src/sys/windows/path.rs b/library/std/src/sys/windows/path.rs index eea7f3247c0..ad3f44fee8d 100644 --- a/library/std/src/sys/windows/path.rs +++ b/library/std/src/sys/windows/path.rs @@ -150,7 +150,11 @@ fn parse_next_component(path: &OsStr, verbatim: bool) -> (&OsStr, &OsStr) { /// /// This path may or may not have a verbatim prefix. pub(crate) fn maybe_verbatim(path: &Path) -> io::Result<Vec<u16>> { - const LEGACY_MAX_PATH: usize = 260; + // Normally the MAX path is 260 UTF-16 code units (including the NULL). + // However, for APIs such as CreateDirectory[1], the limit is 248. + // + // [1]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createdirectorya#parameters + const LEGACY_MAX_PATH: usize = 248; // UTF-16 encoded code points, used in parsing and building UTF-16 paths. // All of these are in the ASCII range so they can be cast directly to `u16`. const SEP: u16 = b'\\' as _; diff --git a/library/std/src/sys/windows/path/tests.rs b/library/std/src/sys/windows/path/tests.rs index 131d27a99fe..c6c84519f41 100644 --- a/library/std/src/sys/windows/path/tests.rs +++ b/library/std/src/sys/windows/path/tests.rs @@ -81,6 +81,13 @@ fn verbatim() { check(r"\\server\share", r"\\server\share"); check(r"\\.\COM1", r"\\.\COM1"); + // Check that paths of length 247 are converted to verbatim. + // This is necessary for `CreateDirectory`. + check( + r"C:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + r"\\?\C:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + ); + // Make sure opening a drive will work. check("Z:", "Z:"); |
