aboutsummaryrefslogtreecommitdiff
path: root/src/os/path.go
diff options
context:
space:
mode:
authorqmuntal <quimmuntal@gmail.com>2023-08-08 15:31:43 +0200
committerQuim Muntal <quimmuntal@gmail.com>2023-08-09 15:15:57 +0000
commitcd589c8a73415afbf94a8976f20cbed9d4061ba6 (patch)
tree4570b35a090562f95db0b5fcfea51c9a00ea6b7b /src/os/path.go
parentf617a6c8bf1ee3e54459f60acd2ec85ff31f6d4c (diff)
downloadgo-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.go24
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
}