basic: secure_bits_to_strv()

This commit is contained in:
Ivan Kruglov
2025-10-16 03:29:14 -07:00
parent 115083886a
commit 3de607b48b
3 changed files with 75 additions and 19 deletions
+56 -15
View File
@@ -6,30 +6,71 @@
#include "extract-word.h"
#include "securebits-util.h"
#include "string-util.h"
#include "strv.h"
int secure_bits_to_string_alloc(int i, char **s) {
_cleanup_free_ char *str = NULL;
size_t len;
static inline const char* secure_bit_to_string(int i) {
/* match a single bit */
switch (i) {
case SECURE_KEEP_CAPS:
return "keep-caps";
case SECURE_KEEP_CAPS_LOCKED:
return "keep-caps-locked";
case SECURE_NO_SETUID_FIXUP:
return "no-setuid-fixup";
case SECURE_NO_SETUID_FIXUP_LOCKED:
return "no-setuid-fixup-locked";
case SECURE_NOROOT:
return "noroot";
case SECURE_NOROOT_LOCKED:
return "noroot-locked";
default:
assert_not_reached();
}
}
int secure_bits_to_string_alloc(int i, char **ret) {
_cleanup_strv_free_ char **sv = NULL;
_cleanup_free_ char *joined = NULL;
int r;
assert(s);
assert(ret);
r = asprintf(&str, "%s%s%s%s%s%s",
(i & (1 << SECURE_KEEP_CAPS)) ? "keep-caps " : "",
(i & (1 << SECURE_KEEP_CAPS_LOCKED)) ? "keep-caps-locked " : "",
(i & (1 << SECURE_NO_SETUID_FIXUP)) ? "no-setuid-fixup " : "",
(i & (1 << SECURE_NO_SETUID_FIXUP_LOCKED)) ? "no-setuid-fixup-locked " : "",
(i & (1 << SECURE_NOROOT)) ? "noroot " : "",
(i & (1 << SECURE_NOROOT_LOCKED)) ? "noroot-locked " : "");
r = secure_bits_to_strv(i, &sv);
if (r < 0)
return r;
joined = strv_join(sv, " ");
if (!joined)
return -ENOMEM;
len = strlen(str);
if (len != 0)
str[len - 1] = '\0';
*ret = TAKE_PTR(joined);
return 0;
}
*s = TAKE_PTR(str);
int secure_bits_to_strv(int i, char ***ret) {
_cleanup_strv_free_ char **sv = NULL;
static const int bits[] = {
SECURE_KEEP_CAPS,
SECURE_KEEP_CAPS_LOCKED,
SECURE_NO_SETUID_FIXUP,
SECURE_NO_SETUID_FIXUP_LOCKED,
SECURE_NOROOT,
SECURE_NOROOT_LOCKED,
};
int r;
assert(ret);
FOREACH_ELEMENT(bit, bits) {
if (i & (1 << *bit)) {
r = strv_extend(&sv, secure_bit_to_string(*bit));
if (r < 0)
return r;
}
}
*ret = TAKE_PTR(sv);
return 0;
}