diff options
| author | Alex Brainman <alex.brainman@gmail.com> | 2015-02-13 16:12:07 +1100 |
|---|---|---|
| committer | Alex Brainman <alex.brainman@gmail.com> | 2015-04-08 02:06:31 +0000 |
| commit | 32e75bace0ed5e09819760a76d741430116e821e (patch) | |
| tree | c4cb6650e5191b8d7842eb8e7bdc16b460371cd4 /src/path/filepath | |
| parent | 2f16ddc58069f9fa380e79db1c58103654b2af5f (diff) | |
| download | go-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.go | 27 |
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) { |
