core: add socket xattr settings for socket unit

This commit is contained in:
Lennart Poettering
2026-06-23 22:55:23 +02:00
parent ce97f9f6e0
commit cc174775f5
15 changed files with 476 additions and 4 deletions
+55
View File
@@ -224,6 +224,58 @@ static int bus_append_strv_colon(sd_bus_message *m, const char *field, const cha
return bus_append_strv_full(m, field, eq, ":" WHITESPACE, EXTRACT_UNQUOTE);
}
static int bus_append_xattr(sd_bus_message *m, const char *field, const char *eq) {
int r;
assert(m);
assert(field);
/* Sends an extended attribute assignment of the form "name=value" as an a(ss) array of one
* name/value pair (or as an empty array if the value is empty, which resets the list). */
r = sd_bus_message_open_container(m, 'r', "sv");
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_append_basic(m, 's', field);
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_open_container(m, 'v', "a(ss)");
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_open_container(m, 'a', "(ss)");
if (r < 0)
return bus_log_create_error(r);
if (!isempty(eq)) {
_cleanup_free_ char *name = NULL, *value = NULL;
r = split_pair(eq, "=", &name, &value);
if (r < 0)
return log_error_errno(r, "Failed to parse extended attribute expression '%s': %m", eq);
r = sd_bus_message_append(m, "(ss)", name, value);
if (r < 0)
return bus_log_create_error(r);
}
r = sd_bus_message_close_container(m);
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_close_container(m);
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_close_container(m);
if (r < 0)
return bus_log_create_error(r);
return 1;
}
static int bus_append_byte_array(sd_bus_message *m, const char *field, const void *buf, size_t n) {
int r;
@@ -2786,6 +2838,9 @@ static const BusProperty socket_properties[] = {
{ "Timestamping", bus_append_string },
{ "DeferTrigger", bus_append_string },
{ "Symlinks", bus_append_strv },
{ "XAttrEntryPoint", bus_append_xattr },
{ "XAttrListen", bus_append_xattr },
{ "XAttrAccept", bus_append_xattr },
{ "SocketProtocol", bus_append_parse_ip_protocol },
{ "ListenStream", bus_append_listen },
{ "ListenDatagram", bus_append_listen },
+36 -1
View File
@@ -14,7 +14,9 @@
#include "socket-label.h"
#include "socket-util.h"
#include "string-table.h"
#include "strv.h"
#include "umask-util.h"
#include "xattr-util.h"
static const char* const socket_address_bind_ipv6_only_table[_SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX] = {
[SOCKET_ADDRESS_DEFAULT] = "default",
@@ -36,6 +38,32 @@ SocketAddressBindIPv6Only socket_address_bind_ipv6_only_or_bool_from_string(cons
return socket_address_bind_ipv6_only_from_string(s);
}
int socket_set_xattrs(int fd, const char *path, char **xattrs) {
int r;
assert(wildcard_fd_is_valid(fd));
if (strv_isempty(xattrs))
return 0;
r = socket_xattr_supported();
if (r <= 0)
return r;
int c = 0;
STRV_FOREACH_PAIR(name, value, xattrs) {
r = xsetxattr(fd, path, AT_EMPTY_PATH, *name, *value);
if (r < 0) {
log_debug_errno(r, "Failed to set extended attribute '%s' on socket, ignoring: %m", *name);
continue;
}
c++;
}
return c;
}
int socket_address_listen(
const SocketAddress *a,
int flags,
@@ -48,7 +76,9 @@ int socket_address_listen(
mode_t directory_mode,
mode_t socket_mode,
const char *selinux_label,
const char *smack_label) {
const char *smack_label,
char **xattr_entrypoint,
char **xattr_listen) {
_cleanup_close_ int fd = -EBADF;
const char *p;
@@ -119,6 +149,8 @@ int socket_address_listen(
if (r < 0)
return r;
(void) socket_set_xattrs(fd, /* path= */ NULL, xattr_listen);
p = socket_address_get_path(a);
if (p) {
/* Create parents */
@@ -138,11 +170,14 @@ int socket_address_listen(
if (r < 0)
return r;
}
if (smack_label) {
r = mac_smack_apply(p, SMACK_ATTR_ACCESS, smack_label);
if (r < 0)
log_warning_errno(r, "Failed to apply SMACK label for socket path, ignoring: %m");
}
(void) socket_set_xattrs(AT_FDCWD, p, xattr_entrypoint);
} else {
if (bind(fd, &a->sockaddr.sa, a->size) < 0)
return -errno;
+5 -1
View File
@@ -26,4 +26,8 @@ int socket_address_listen(
mode_t directory_mode,
mode_t socket_mode,
const char *selinux_label,
const char *smack_label);
const char *smack_label,
char **xattr_entrypoint,
char **xattr_listen);
int socket_set_xattrs(int fd, const char *path, char **xattrs);
+3 -1
View File
@@ -198,7 +198,9 @@ int make_socket_fd(int log_level, const char* address, int type, int flags) {
0755,
0644,
/* selinux_label= */ NULL,
/* smack_label= */ NULL);
/* smack_label= */ NULL,
/* xattr_entrypoint= */ NULL,
/* xattr_listen= */ NULL);
if (fd < 0 || log_get_max_level() >= log_level) {
_cleanup_free_ char *p = NULL;