mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
os: handle the sticky bit separately for *BSD and Solaris
open(2) and mkdir(2) won't set the sticky bit on *BSD and Solaris. This behavior is mentioned on sticky(8). see also: https://github.com/dotcloud/docker/pull/6587 Fixes #8383. Change-Id: Ic4733700f9926b9fc2b6fd1f998acec34e518764 Reviewed-on: https://go-review.googlesource.com/1673 Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
60ea2c594b
commit
6262902070
4 changed files with 43 additions and 0 deletions
|
|
@ -75,11 +75,23 @@ const DevNull = "/dev/null"
|
|||
// methods on the returned File can be used for I/O.
|
||||
// If there is an error, it will be of type *PathError.
|
||||
func OpenFile(name string, flag int, perm FileMode) (file *File, err error) {
|
||||
chmod := false
|
||||
if !supportsCreateWithStickyBit && flag&O_CREATE != 0 && perm&ModeSticky != 0 {
|
||||
if _, err := Stat(name); IsNotExist(err) {
|
||||
chmod = true
|
||||
}
|
||||
}
|
||||
|
||||
r, e := syscall.Open(name, flag|syscall.O_CLOEXEC, syscallMode(perm))
|
||||
if e != nil {
|
||||
return nil, &PathError{"open", name, e}
|
||||
}
|
||||
|
||||
// open(2) itself won't handle the sticky bit on *BSD and Solaris
|
||||
if chmod && e == nil {
|
||||
e = Chmod(name, perm)
|
||||
}
|
||||
|
||||
// There's a race here with fork/exec, which we are
|
||||
// content to live with. See ../syscall/exec_unix.go.
|
||||
if !supportsCloseOnExec {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue