summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-12-31 22:35:54 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-01-02 19:45:48 -0500
commit5ce70e5bcd62e89b52485961c3699312ee4a7e0e (patch)
tree3cfa1d90fb492d5b71a38b4a8d57fe8bc5674416 /src/shared
parentac6b760ceedd4b21921b6a682cf1479af3d3024f (diff)
Introduce cleanup functions for cap_free
Unfortunately a different cleanup function is necessary per type, because cap_t** and char** are incompatible with void**.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/capability.c24
-rw-r--r--src/shared/capability.h12
2 files changed, 18 insertions, 18 deletions
diff --git a/src/shared/capability.c b/src/shared/capability.c
index 72c671cf84..f8ee1c6838 100644
--- a/src/shared/capability.c
+++ b/src/shared/capability.c
@@ -37,21 +37,17 @@
#include "fileio.h"
int have_effective_cap(int value) {
- cap_t cap;
+ _cleanup_cap_free_ cap_t cap;
cap_flag_value_t fv;
- int r;
cap = cap_get_proc();
if (!cap)
return -errno;
if (cap_get_flag(cap, value, CAP_EFFECTIVE, &fv) < 0)
- r = -errno;
+ return -errno;
else
- r = fv == CAP_SET;
-
- cap_free(cap);
- return r;
+ return fv == CAP_SET;
}
unsigned long cap_last_cap(void) {
@@ -89,7 +85,7 @@ unsigned long cap_last_cap(void) {
int capability_bounding_set_drop(uint64_t drop, bool right_now) {
unsigned long i;
- cap_t after_cap = NULL, temp_cap = NULL;
+ _cleanup_cap_free_ cap_t after_cap = NULL, temp_cap = NULL;
cap_flag_value_t fv;
int r;
@@ -102,10 +98,8 @@ int capability_bounding_set_drop(uint64_t drop, bool right_now) {
if (!after_cap)
return -errno;
- if (cap_get_flag(after_cap, CAP_SETPCAP, CAP_EFFECTIVE, &fv) < 0) {
- cap_free(after_cap);
+ if (cap_get_flag(after_cap, CAP_SETPCAP, CAP_EFFECTIVE, &fv) < 0)
return -errno;
- }
if (fv != CAP_SET) {
static const cap_value_t v = CAP_SETPCAP;
@@ -162,13 +156,7 @@ int capability_bounding_set_drop(uint64_t drop, bool right_now) {
r = 0;
finish:
- if (temp_cap)
- cap_free(temp_cap);
-
- if (after_cap) {
- cap_set_proc(after_cap);
- cap_free(after_cap);
- }
+ cap_set_proc(after_cap);
return r;
}
diff --git a/src/shared/capability.h b/src/shared/capability.h
index 59469e56cb..64f86410ab 100644
--- a/src/shared/capability.h
+++ b/src/shared/capability.h
@@ -23,8 +23,20 @@
#include <inttypes.h>
#include <stdbool.h>
+#include <sys/capability.h>
+
+#include "util.h"
unsigned long cap_last_cap(void);
int have_effective_cap(int value);
int capability_bounding_set_drop(uint64_t drop, bool right_now);
int capability_bounding_set_drop_usermode(uint64_t drop);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(cap_t, cap_free);
+#define _cleanup_cap_free_ _cleanup_(cap_freep)
+
+static inline void cap_free_charpp(char **p) {
+ if (*p)
+ cap_free(*p);
+}
+#define _cleanup_cap_free_charp_ _cleanup_(cap_free_charpp)