core: add socket xattr settings for socket unit
This commit is contained in:
@@ -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 },
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user