summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew G. Morgan <morgan@kernel.org>2019-12-29 16:50:09 -0800
committerAndrew G. Morgan <morgan@kernel.org>2019-12-29 16:50:09 -0800
commit872d2ee59e29644d73b7530a27404a3d5c8ee42d (patch)
tree8fb2b38235ccc00eaafd35cb1b134312e3655e9e
parent71496f3811311ddcc0ab325594c88cacfd3e5b1a (diff)
downloadlibcap2-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.go4
-rw-r--r--cap/legacy.go7
-rw-r--r--cap/modern.go8
-rw-r--r--libcap/cap_proc.c9
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) {