diff options
| author | qmuntal <quimmuntal@gmail.com> | 2023-08-08 15:31:43 +0200 |
|---|---|---|
| committer | Quim Muntal <quimmuntal@gmail.com> | 2023-08-09 15:15:57 +0000 |
| commit | cd589c8a73415afbf94a8976f20cbed9d4061ba6 (patch) | |
| tree | 4570b35a090562f95db0b5fcfea51c9a00ea6b7b /src/os/path.go | |
| parent | f617a6c8bf1ee3e54459f60acd2ec85ff31f6d4c (diff) | |
| download | go-cd589c8a73415afbf94a8976f20cbed9d4061ba6.tar.xz | |
os: make MkdirAll support volume names
MkdirAll fails to create directories under root paths using volume
names (e.g. //?/Volume{GUID}/foo). This is because fixRootDirectory
only handle extended length paths using drive letters (e.g. //?/C:/foo).
This CL fixes that issue by also detecting volume names without path
separator.
Updates #22230
Fixes #39785
Change-Id: I813fdc0b968ce71a4297f69245b935558e6cd789
Reviewed-on: https://go-review.googlesource.com/c/go/+/517015
Run-TryBot: Quim Muntal <quimmuntal@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/os/path.go')
| -rw-r--r-- | src/os/path.go | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/os/path.go b/src/os/path.go index df87887b9b..6ac4cbe20f 100644 --- a/src/os/path.go +++ b/src/os/path.go @@ -26,19 +26,25 @@ func MkdirAll(path string, perm FileMode) error { } // Slow path: make sure parent exists and then call Mkdir for path. - i := len(path) - for i > 0 && IsPathSeparator(path[i-1]) { // Skip trailing path separator. + + // Extract the parent folder from path by first removing any trailing + // path separator and then scanning backward until finding a path + // separator or reaching the beginning of the string. + i := len(path) - 1 + for i >= 0 && IsPathSeparator(path[i]) { i-- } - - j := i - for j > 0 && !IsPathSeparator(path[j-1]) { // Scan backward over element. - j-- + for i >= 0 && !IsPathSeparator(path[i]) { + i-- + } + if i < 0 { + i = 0 } - if j > 1 { - // Create parent. - err = MkdirAll(fixRootDirectory(path[:j-1]), perm) + // If there is a parent directory, and it is not the volume name, + // recurse to ensure parent directory exists. + if parent := path[:i]; len(parent) > len(volumeName(path)) { + err = MkdirAll(parent, perm) if err != nil { return err } |
