diff --git a/pkg/kubelet/eviction/threshold_notifier_linux.go b/pkg/kubelet/eviction/threshold_notifier_linux.go index 1d097fd293f..8ac1ac6cf25 100644 --- a/pkg/kubelet/eviction/threshold_notifier_linux.go +++ b/pkg/kubelet/eviction/threshold_notifier_linux.go @@ -48,12 +48,12 @@ var _ CgroupNotifier = &linuxCgroupNotifier{} func NewCgroupNotifier(path, attribute string, threshold int64) (CgroupNotifier, error) { var watchfd, eventfd, epfd, controlfd int var err error - watchfd, err = unix.Open(fmt.Sprintf("%s/%s", path, attribute), unix.O_RDONLY, 0) + watchfd, err = unix.Open(fmt.Sprintf("%s/%s", path, attribute), unix.O_RDONLY|unix.O_CLOEXEC, 0) if err != nil { return nil, err } defer unix.Close(watchfd) - controlfd, err = unix.Open(fmt.Sprintf("%s/cgroup.event_control", path), unix.O_WRONLY, 0) + controlfd, err = unix.Open(fmt.Sprintf("%s/cgroup.event_control", path), unix.O_WRONLY|unix.O_CLOEXEC, 0) if err != nil { return nil, err } @@ -72,7 +72,7 @@ func NewCgroupNotifier(path, attribute string, threshold int64) (CgroupNotifier, unix.Close(eventfd) } }() - epfd, err = unix.EpollCreate1(0) + epfd, err = unix.EpollCreate1(unix.EPOLL_CLOEXEC) if err != nil { return nil, err } diff --git a/pkg/util/flock/flock_unix.go b/pkg/util/flock/flock_unix.go index 92d929f4e5a..3dae621b736 100644 --- a/pkg/util/flock/flock_unix.go +++ b/pkg/util/flock/flock_unix.go @@ -23,7 +23,7 @@ import "golang.org/x/sys/unix" // Acquire acquires a lock on a file for the duration of the process. This method // is reentrant. func Acquire(path string) error { - fd, err := unix.Open(path, unix.O_CREAT|unix.O_RDWR, 0600) + fd, err := unix.Open(path, unix.O_CREAT|unix.O_RDWR|unix.O_CLOEXEC, 0600) if err != nil { return err } diff --git a/pkg/util/mount/mount_linux.go b/pkg/util/mount/mount_linux.go index 321034a316e..3e438870fa9 100644 --- a/pkg/util/mount/mount_linux.go +++ b/pkg/util/mount/mount_linux.go @@ -497,7 +497,7 @@ func ExclusiveOpenFailsOnDevice(pathname string) (bool, error) { klog.Errorf("Path %q is not referring to a device.", pathname) return false, nil } - fd, errno := unix.Open(pathname, unix.O_RDONLY|unix.O_EXCL, 0) + fd, errno := unix.Open(pathname, unix.O_RDONLY|unix.O_EXCL|unix.O_CLOEXEC, 0) // If the device is in use, open will return an invalid fd. // When this happens, it is expected that Close will fail and throw an error. defer unix.Close(fd) diff --git a/pkg/volume/util/subpath/subpath_linux.go b/pkg/volume/util/subpath/subpath_linux.go index 109a58a94c8..b497a810dc2 100644 --- a/pkg/volume/util/subpath/subpath_linux.go +++ b/pkg/volume/util/subpath/subpath_linux.go @@ -398,7 +398,7 @@ func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { return fmt.Errorf("cannot create directory %s: %s", currentPath, err) } // Dive into the created directory - childFD, err = syscall.Openat(parentFD, dir, nofollowFlags, 0) + childFD, err = syscall.Openat(parentFD, dir, nofollowFlags|unix.O_CLOEXEC, 0) if err != nil { return fmt.Errorf("cannot open %s: %s", currentPath, err) } @@ -454,7 +454,7 @@ func findExistingPrefix(base, pathname string) (string, []string, error) { // This should be faster than looping through all dirs and calling os.Stat() // on each of them, as the symlinks are resolved only once with OpenAt(). currentPath := base - fd, err := syscall.Open(currentPath, syscall.O_RDONLY, 0) + fd, err := syscall.Open(currentPath, syscall.O_RDONLY|syscall.O_CLOEXEC, 0) if err != nil { return pathname, nil, fmt.Errorf("error opening %s: %s", currentPath, err) } @@ -466,7 +466,7 @@ func findExistingPrefix(base, pathname string) (string, []string, error) { for i, dir := range dirs { // Using O_PATH here will prevent hangs in case user replaces directory with // fifo - childFD, err := syscall.Openat(fd, dir, unix.O_PATH, 0) + childFD, err := syscall.Openat(fd, dir, unix.O_PATH|unix.O_CLOEXEC, 0) if err != nil { if os.IsNotExist(err) { return currentPath, dirs[i:], nil @@ -499,7 +499,7 @@ func doSafeOpen(pathname string, base string) (int, error) { // Assumption: base is the only directory that we have under control. // Base dir is not allowed to be a symlink. - parentFD, err := syscall.Open(base, nofollowFlags, 0) + parentFD, err := syscall.Open(base, nofollowFlags|unix.O_CLOEXEC, 0) if err != nil { return -1, fmt.Errorf("cannot open directory %s: %s", base, err) } @@ -531,7 +531,7 @@ func doSafeOpen(pathname string, base string) (int, error) { } klog.V(5).Infof("Opening path %s", currentPath) - childFD, err = syscall.Openat(parentFD, seg, openFDFlags, 0) + childFD, err = syscall.Openat(parentFD, seg, openFDFlags|unix.O_CLOEXEC, 0) if err != nil { return -1, fmt.Errorf("cannot open %s: %s", currentPath, err) } diff --git a/pkg/volume/util/subpath/subpath_nsenter_test.go b/pkg/volume/util/subpath/subpath_nsenter_test.go index 4ecb6916565..b962f3354db 100644 --- a/pkg/volume/util/subpath/subpath_nsenter_test.go +++ b/pkg/volume/util/subpath/subpath_nsenter_test.go @@ -83,7 +83,7 @@ func TestCheckDeviceInode(t *testing.T) { continue } - fd, err := unix.Open(test.srcPath, unix.O_CREAT, 0644) + fd, err := unix.Open(test.srcPath, unix.O_CREAT|unix.O_CLOEXEC, 0644) if err != nil { t.Errorf("Test %q: cannot open srcPath %s: %s", test.name, test.srcPath, err) continue