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>
diff --git a/src/syscall/exec_windows.go b/src/syscall/exec_windows.go
index 936aeb5..cc1abc4 100644
--- a/src/syscall/exec_windows.go
+++ b/src/syscall/exec_windows.go
@@ -135,23 +135,17 @@
if err != nil {
return "", err
}
- buf := make([]uint16, 100)
- n, err := GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
- if err != nil {
- return "", err
- }
- if n > uint32(len(buf)) {
- // Windows is asking for bigger buffer.
- buf = make([]uint16, n)
+ n := uint32(100)
+ for {
+ buf := make([]uint16, n)
n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
if err != nil {
return "", err
}
- if n > uint32(len(buf)) {
- return "", EINVAL
+ if n <= uint32(len(buf)) {
+ return UTF16ToString(buf[:n]), nil
}
}
- return UTF16ToString(buf[:n]), nil
}
func isSlash(c uint8) bool {