mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
syscall: add AmbientCaps to linux SysProcAttr
Fixes #19713 Change-Id: Id1ca61b35bca2a4bea23dd64c7fb001a3a14fd88 Reviewed-on: https://go-review.googlesource.com/43512 Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
773504aee5
commit
8aee0b8b32
2 changed files with 181 additions and 0 deletions
|
|
@ -40,6 +40,7 @@ type SysProcAttr struct {
|
|||
// This parameter is no-op if GidMappings == nil. Otherwise for unprivileged
|
||||
// users this should be set to false for mappings work.
|
||||
GidMappingsEnableSetgroups bool
|
||||
AmbientCaps []uintptr // Ambient capabilities (Linux only)
|
||||
}
|
||||
|
||||
var (
|
||||
|
|
@ -101,6 +102,12 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
|
|||
//go:noinline
|
||||
//go:norace
|
||||
func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (r1 uintptr, err1 Errno, p [2]int, locked bool) {
|
||||
// Defined in linux/prctl.h starting with Linux 4.3.
|
||||
const (
|
||||
PR_CAP_AMBIENT = 0x2f
|
||||
PR_CAP_AMBIENT_RAISE = 0x2
|
||||
)
|
||||
|
||||
// vfork requires that the child not touch any of the parent's
|
||||
// active stack frames. Hence, the child does all post-fork
|
||||
// processing in this stack frame and never returns, while the
|
||||
|
|
@ -165,6 +172,14 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
|
|||
|
||||
runtime_AfterForkInChild()
|
||||
|
||||
// Enable the "keep capabilities" flag to set ambient capabilities later.
|
||||
if len(sys.AmbientCaps) > 0 {
|
||||
_, _, err1 = RawSyscall6(SYS_PRCTL, PR_SET_KEEPCAPS, 1, 0, 0, 0, 0)
|
||||
if err1 != 0 {
|
||||
goto childerror
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for User ID/Group ID mappings to be written.
|
||||
if sys.UidMappings != nil || sys.GidMappings != nil {
|
||||
if _, _, err1 = RawSyscall(SYS_CLOSE, uintptr(p[1]), 0, 0); err1 != 0 {
|
||||
|
|
@ -279,6 +294,13 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att
|
|||
}
|
||||
}
|
||||
|
||||
for _, c := range sys.AmbientCaps {
|
||||
_, _, err1 = RawSyscall6(SYS_PRCTL, PR_CAP_AMBIENT, uintptr(PR_CAP_AMBIENT_RAISE), c, 0, 0, 0)
|
||||
if err1 != 0 {
|
||||
goto childerror
|
||||
}
|
||||
}
|
||||
|
||||
// Chdir
|
||||
if dir != nil {
|
||||
_, _, err1 = RawSyscall(SYS_CHDIR, uintptr(unsafe.Pointer(dir)), 0, 0)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue