mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 02:41:25 +00:00
when the systemd cgroup manager is used, controllers not handled by systemd are created manually afterwards. libcontainer didn't correctly cleanup these cgroups that were leaked on cgroup v1. Closes: https://github.com/kubernetes/kubernetes/issues/92766 Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
70 lines
1.0 KiB
Go
70 lines
1.0 KiB
Go
package internal
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"runtime"
|
|
"strconv"
|
|
|
|
"github.com/cilium/ebpf/internal/unix"
|
|
)
|
|
|
|
var ErrClosedFd = errors.New("use of closed file descriptor")
|
|
|
|
type FD struct {
|
|
raw int64
|
|
}
|
|
|
|
func NewFD(value uint32) *FD {
|
|
fd := &FD{int64(value)}
|
|
runtime.SetFinalizer(fd, (*FD).Close)
|
|
return fd
|
|
}
|
|
|
|
func (fd *FD) String() string {
|
|
return strconv.FormatInt(fd.raw, 10)
|
|
}
|
|
|
|
func (fd *FD) Value() (uint32, error) {
|
|
if fd.raw < 0 {
|
|
return 0, ErrClosedFd
|
|
}
|
|
|
|
return uint32(fd.raw), nil
|
|
}
|
|
|
|
func (fd *FD) Close() error {
|
|
if fd.raw < 0 {
|
|
return nil
|
|
}
|
|
|
|
value := int(fd.raw)
|
|
fd.raw = -1
|
|
|
|
fd.Forget()
|
|
return unix.Close(value)
|
|
}
|
|
|
|
func (fd *FD) Forget() {
|
|
runtime.SetFinalizer(fd, nil)
|
|
}
|
|
|
|
func (fd *FD) Dup() (*FD, error) {
|
|
if fd.raw < 0 {
|
|
return nil, ErrClosedFd
|
|
}
|
|
|
|
dup, err := unix.FcntlInt(uintptr(fd.raw), unix.F_DUPFD_CLOEXEC, 0)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("can't dup fd: %v", err)
|
|
}
|
|
|
|
return NewFD(uint32(dup)), nil
|
|
}
|
|
|
|
func (fd *FD) File(name string) *os.File {
|
|
fd.Forget()
|
|
return os.NewFile(uintptr(fd.raw), name)
|
|
}
|