summaryrefslogtreecommitdiff
path: root/libcap/cap_proc.c
diff options
context:
space:
mode:
authorAndrew G. Morgan <morgan@kernel.org>2020-01-13 14:05:22 -0800
committerAndrew G. Morgan <morgan@kernel.org>2020-01-19 14:05:52 -0800
commit74fa15fa35bd658ca56f5ce05e9784c7e46b1041 (patch)
tree91e5e00d36795e0a37d9cd6ccc0953fe45d17d6c /libcap/cap_proc.c
parent5aa8f08c53f8c8824b653f6513ebc4de1b7c0185 (diff)
downloadlibcap2-74fa15fa35bd658ca56f5ce05e9784c7e46b1041.tar.gz
Use the lighter weight prctl for reading bounding set.
No need to use the psx syscall path for reading the bounding set. Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
Diffstat (limited to 'libcap/cap_proc.c')
-rw-r--r--libcap/cap_proc.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/libcap/cap_proc.c b/libcap/cap_proc.c
index 4006151..078a8c3 100644
--- a/libcap/cap_proc.c
+++ b/libcap/cap_proc.c
@@ -37,9 +37,9 @@ static long int _cap_syscall6(long int syscall_nr,
return syscall(syscall_nr, arg1, arg2, arg3, arg4, arg5, arg6);
}
-static long int (*_libcap_syscall)(long int, long int, long int, long int)
+static long int (*_libcap_wsyscall3)(long int, long int, long int, long int)
= _cap_syscall;
-static long int (*_libcap_syscall6)(long int, long int, long int, long int,
+static long int (*_libcap_wsyscall6)(long int, long int, long int, long int,
long int, long int, long int) = _cap_syscall6;
/*
@@ -79,27 +79,27 @@ void cap_set_syscall(long int (*new_syscall)(long int,
long int, long int,
long int)) {
if (new_syscall == NULL) {
- psx_load_syscalls(&_libcap_syscall, &_libcap_syscall6);
+ psx_load_syscalls(&_libcap_wsyscall3, &_libcap_wsyscall6);
} else {
- _libcap_syscall = new_syscall;
- _libcap_syscall6 = new_syscall6;
+ _libcap_wsyscall3 = new_syscall;
+ _libcap_wsyscall6 = new_syscall6;
}
}
static int _libcap_capset(cap_user_header_t header, const cap_user_data_t data)
{
- return _libcap_syscall(SYS_capset, (long int) header, (long int) data, 0);
+ return _libcap_wsyscall3(SYS_capset, (long int) header, (long int) data, 0);
}
-static int _libcap_prctl(long int pr_cmd, long int arg1, long int arg2)
+static int _libcap_wprctl3(long int pr_cmd, long int arg1, long int arg2)
{
- return _libcap_syscall(SYS_prctl, pr_cmd, arg1, arg2);
+ return _libcap_wsyscall3(SYS_prctl, pr_cmd, arg1, arg2);
}
-static int _libcap_prctl6(long int pr_cmd, long int arg1, long int arg2,
- long int arg3, long int arg4, long int arg5)
+static int _libcap_wprctl6(long int pr_cmd, long int arg1, long int arg2,
+ long int arg3, long int arg4, long int arg5)
{
- return _libcap_syscall6(SYS_prctl, pr_cmd, arg1, arg2, arg3, arg4, arg5);
+ return _libcap_wsyscall6(SYS_prctl, pr_cmd, arg1, arg2, arg3, arg4, arg5);
}
/*
@@ -214,7 +214,7 @@ int cap_get_bound(cap_value_t cap)
{
int result;
- result = _libcap_prctl(PR_CAPBSET_READ, pr_arg(cap), pr_arg(0));
+ result = prctl(PR_CAPBSET_READ, pr_arg(cap), pr_arg(0));
if (result < 0) {
errno = -result;
return -1;
@@ -228,7 +228,7 @@ int cap_drop_bound(cap_value_t cap)
{
int result;
- result = _libcap_prctl(PR_CAPBSET_DROP, pr_arg(cap), pr_arg(0));
+ result = _libcap_wprctl3(PR_CAPBSET_DROP, pr_arg(cap), pr_arg(0));
if (result < 0) {
errno = -result;
return -1;
@@ -266,8 +266,8 @@ int cap_set_ambient(cap_value_t cap, cap_flag_value_t set)
errno = EINVAL;
return -1;
}
- result = _libcap_prctl6(PR_CAP_AMBIENT, pr_arg(val), pr_arg(cap),
- pr_arg(0), pr_arg(0), pr_arg(0));
+ result = _libcap_wprctl6(PR_CAP_AMBIENT, pr_arg(val), pr_arg(cap),
+ pr_arg(0), pr_arg(0), pr_arg(0));
if (result < 0) {
errno = -result;
return -1;
@@ -295,8 +295,8 @@ int cap_reset_ambient()
}
}
- result = _libcap_prctl6(PR_CAP_AMBIENT, pr_arg(PR_CAP_AMBIENT_CLEAR_ALL),
- pr_arg(0), pr_arg(0), pr_arg(0), pr_arg(0));
+ result = _libcap_wprctl6(PR_CAP_AMBIENT, pr_arg(PR_CAP_AMBIENT_CLEAR_ALL),
+ pr_arg(0), pr_arg(0), pr_arg(0), pr_arg(0));
if (result < 0) {
errno = -result;
return -1;
@@ -316,7 +316,7 @@ unsigned cap_get_secbits(void)
*/
int cap_set_secbits(unsigned bits)
{
- return _libcap_prctl(PR_SET_SECUREBITS, bits, 0);
+ return _libcap_wprctl3(PR_SET_SECUREBITS, bits, 0);
}
/*
@@ -467,11 +467,11 @@ int cap_setuid(uid_t uid)
* compliant way for the code below to work, so we are either
* all-broken or not-broken and don't allow for "sort of working".
*/
- (void) _libcap_prctl(PR_SET_KEEPCAPS, 1, 0);
+ (void) _libcap_wprctl3(PR_SET_KEEPCAPS, 1, 0);
int ret = cap_set_proc(working);
if (ret == 0) {
if (_libcap_overrode_syscalls) {
- ret = _libcap_syscall(SYS_setuid, (long int) uid, 0, 0);
+ ret = _libcap_wsyscall3(SYS_setuid, (long int) uid, 0, 0);
if (ret < 0) {
errno = -ret;
ret = -1;
@@ -481,7 +481,7 @@ int cap_setuid(uid_t uid)
}
}
int olderrno = errno;
- (void) _libcap_prctl(PR_SET_KEEPCAPS, 0, 0);
+ (void) _libcap_wprctl3(PR_SET_KEEPCAPS, 0, 0);
(void) cap_clear_flag(working, CAP_EFFECTIVE);
(void) cap_set_proc(working);
@@ -521,10 +521,10 @@ int cap_setgroups(gid_t gid, size_t ngroups, const gid_t groups[])
int ret = cap_set_proc(working);
if (_libcap_overrode_syscalls) {
if (ret == 0) {
- ret = _libcap_syscall(SYS_setgid, (long int) gid, 0, 0);
+ ret = _libcap_wsyscall3(SYS_setgid, (long int) gid, 0, 0);
}
if (ret == 0) {
- ret = _libcap_syscall(sys_setgroups_variant, (long int) ngroups,
+ ret = _libcap_wsyscall3(sys_setgroups_variant, (long int) ngroups,
(long int) groups, 0);
}
if (ret < 0) {