mirror of
https://github.com/golang/go
synced 2024-11-18 19:44:46 -07:00
os: correct bad PathError message from FileOpen with O_CREATE on Plan 9
On Plan 9, FileOpen with flag O_CREATE & ~O_TRUNC is done in two steps. First, syscall.Open is attempted, to avoid truncation when opening an existing file. If that fails because the file doesn't exist, syscall.Create is used to create a new file. If the Create fails, for example because we are racing with another process to create a ModeExclusive file, the PathError returned from FileOpen should reflect the result of the Create, not the "does not exist" error from the initial Open attempt. Fixes #38540 Change-Id: I90c95a301de417ecdf79cd52748591edb1dbf528 Reviewed-on: https://go-review.googlesource.com/c/go/+/229099 Run-TryBot: David du Colombier <0intro@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David du Colombier <0intro@gmail.com>
This commit is contained in:
parent
876c1feb7d
commit
664d270727
@ -112,10 +112,9 @@ func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
|
|||||||
} else {
|
} else {
|
||||||
fd, e = syscall.Open(name, flag)
|
fd, e = syscall.Open(name, flag)
|
||||||
if IsNotExist(e) && create {
|
if IsNotExist(e) && create {
|
||||||
var e1 error
|
fd, e = syscall.Create(name, flag, syscallMode(perm))
|
||||||
fd, e1 = syscall.Create(name, flag, syscallMode(perm))
|
if e != nil {
|
||||||
if e1 == nil {
|
return nil, &PathError{"create", name, e}
|
||||||
e = nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user