diff options
author | Andrew G. Morgan <morgan@kernel.org> | 2019-12-29 16:50:09 -0800 |
---|---|---|
committer | Andrew G. Morgan <morgan@kernel.org> | 2019-12-29 16:50:09 -0800 |
commit | 872d2ee59e29644d73b7530a27404a3d5c8ee42d (patch) | |
tree | 8fb2b38235ccc00eaafd35cb1b134312e3655e9e | |
parent | 71496f3811311ddcc0ab325594c88cacfd3e5b1a (diff) | |
download | libcap2-872d2ee59e29644d73b7530a27404a3d5c8ee42d.tar.gz |
Exploring compilation issues on 32-bit architectures.
Notably, arm and x86 have to use a setgroups32 syscall.
Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
-rw-r--r-- | cap/convenience.go | 4 | ||||
-rw-r--r-- | cap/legacy.go | 7 | ||||
-rw-r--r-- | cap/modern.go | 8 | ||||
-rw-r--r-- | libcap/cap_proc.c | 9 |
4 files changed, 25 insertions, 3 deletions
diff --git a/cap/convenience.go b/cap/convenience.go index d60b2d6..9dd9d07 100644 --- a/cap/convenience.go +++ b/cap/convenience.go @@ -236,7 +236,7 @@ func SetGroups(gid int, suppl ...int) error { return err } if len(suppl) == 0 { - if _, _, err := callWKernel(syscall.SYS_SETGROUPS, 0, 0, 0); err != 0 { + if _, _, err := callWKernel(sys_setgroups_variant, 0, 0, 0); err != 0 { return err } return nil @@ -247,7 +247,7 @@ func SetGroups(gid int, suppl ...int) error { for i, g := range suppl { gs[i] = uint32(g) } - if _, _, err := callWKernel(syscall.SYS_SETGROUPS, uintptr(len(suppl)), uintptr(unsafe.Pointer(&gs[0])), 0); err != 0 { + if _, _, err := callWKernel(sys_setgroups_variant, uintptr(len(suppl)), uintptr(unsafe.Pointer(&gs[0])), 0); err != 0 { return err } return nil diff --git a/cap/legacy.go b/cap/legacy.go new file mode 100644 index 0000000..7bdf9b4 --- /dev/null +++ b/cap/legacy.go @@ -0,0 +1,7 @@ +// +build linux,arm linux,386 + +package cap + +import "syscall" + +var sys_setgroups_variant = uintptr(syscall.SYS_SETGROUPS32) diff --git a/cap/modern.go b/cap/modern.go new file mode 100644 index 0000000..04a4919 --- /dev/null +++ b/cap/modern.go @@ -0,0 +1,8 @@ +// +build linux,!arm +// +build linux,!386 + +package cap + +import "syscall" + +var sys_setgroups_variant = uintptr(syscall.SYS_SETGROUPS) diff --git a/libcap/cap_proc.c b/libcap/cap_proc.c index 28fca22..310922c 100644 --- a/libcap/cap_proc.c +++ b/libcap/cap_proc.c @@ -477,6 +477,13 @@ int cap_setuid(uid_t uid) return ret; } +#if defined(__arm__) || defined(__i386__) || \ + defined(__i486__) || defined(__i586__) || defined(__i686__) +#define sys_setgroups_variant SYS_setgroups32 +#else +#define sys_setgroups_variant SYS_setgroups +#endif + /* * cap_setgroups combines setting the gid with changing the set of * supplemental groups for a user into one call that raises the needed @@ -503,7 +510,7 @@ int cap_setgroups(gid_t gid, size_t ngroups, const gid_t groups[]) ret = _libcap_syscall(SYS_setgid, (long int) gid, 0, 0); } if (ret == 0) { - ret = _libcap_syscall(SYS_setgroups, (long int) ngroups, + ret = _libcap_syscall(sys_setgroups_variant, (long int) ngroups, (long int) groups, 0); } if (ret < 0) { |