aboutsummaryrefslogtreecommitdiff
path: root/src/path/filepath
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2015-02-13 16:12:07 +1100
committerAlex Brainman <alex.brainman@gmail.com>2015-04-08 02:06:31 +0000
commit32e75bace0ed5e09819760a76d741430116e821e (patch)
treec4cb6650e5191b8d7842eb8e7bdc16b460371cd4 /src/path/filepath
parent2f16ddc58069f9fa380e79db1c58103654b2af5f (diff)
downloadgo-32e75bace0ed5e09819760a76d741430116e821e.tar.xz
all: fix race when allocating buffer for some windows syscalls
Fixes #9753 Change-Id: I6c641ed7ef4f687a108e7d937ab4b9c24d5baf5d Reviewed-on: https://go-review.googlesource.com/4940 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/path/filepath')
-rw-r--r--src/path/filepath/symlink_windows.go27
1 files changed, 12 insertions, 15 deletions
diff --git a/src/path/filepath/symlink_windows.go b/src/path/filepath/symlink_windows.go
index 327c2c89a3..4b38f6fac3 100644
--- a/src/path/filepath/symlink_windows.go
+++ b/src/path/filepath/symlink_windows.go
@@ -14,18 +14,17 @@ func toShort(path string) (string, error) {
return "", err
}
b := p // GetShortPathName says we can reuse buffer
- n, err := syscall.GetShortPathName(&p[0], &b[0], uint32(len(b)))
- if err != nil {
- return "", err
- }
- if n > uint32(len(b)) {
- b = make([]uint16, n)
+ n := uint32(len(b))
+ for {
n, err = syscall.GetShortPathName(&p[0], &b[0], uint32(len(b)))
if err != nil {
return "", err
}
+ if n <= uint32(len(b)) {
+ return syscall.UTF16ToString(b[:n]), nil
+ }
+ b = make([]uint16, n)
}
- return syscall.UTF16ToString(b), nil
}
func toLong(path string) (string, error) {
@@ -34,19 +33,17 @@ func toLong(path string) (string, error) {
return "", err
}
b := p // GetLongPathName says we can reuse buffer
- n, err := syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
- if err != nil {
- return "", err
- }
- if n > uint32(len(b)) {
- b = make([]uint16, n)
+ n := uint32(len(b))
+ for {
n, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
if err != nil {
return "", err
}
+ if n <= uint32(len(b)) {
+ return syscall.UTF16ToString(b[:n]), nil
+ }
+ b = make([]uint16, n)
}
- b = b[:n]
- return syscall.UTF16ToString(b), nil
}
func evalSymlinks(path string) (string, error) {