socket-util: add new helper socket_xattr_supported()
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include <poll.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
@@ -21,6 +22,7 @@
|
||||
#include "fd-util.h"
|
||||
#include "format-ifname.h"
|
||||
#include "format-util.h"
|
||||
#include "fs-util.h"
|
||||
#include "in-addr-util.h"
|
||||
#include "io-util.h"
|
||||
#include "log.h"
|
||||
@@ -36,6 +38,8 @@
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
#include "sysctl-util.h"
|
||||
#include "tmpfile-util.h"
|
||||
#include "xattr-util.h"
|
||||
|
||||
#if ENABLE_IDN
|
||||
# define IDN_FLAGS NI_IDN
|
||||
@@ -1891,3 +1895,41 @@ int tos_to_priority(uint8_t tos) {
|
||||
return TC_PRIO_BESTEFFORT;
|
||||
}
|
||||
}
|
||||
|
||||
int socket_xattr_supported(void) {
|
||||
int r;
|
||||
|
||||
// FIXME: Drop this check once Linux 7.0 becomes our baseline
|
||||
|
||||
/* Checks if socket inodes may have xattrs on this kernel. This should pass on kernel 7.0, fail on
|
||||
* older kernels */
|
||||
|
||||
static int cached = -1;
|
||||
if (cached >= 0)
|
||||
return cached;
|
||||
|
||||
const char *t;
|
||||
r = tmp_dir(&t);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
_cleanup_free_ char *sp = NULL;
|
||||
r = tempfn_random_child(t, "sockxattrtest", &sp);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (mknod(sp, S_IFSOCK | 0600, /* dev= */ 0) < 0)
|
||||
return -errno;
|
||||
|
||||
_cleanup_(unlink_and_freep) char *sp_destroy = TAKE_PTR(sp);
|
||||
|
||||
/* Old kernels return EPERM. But let's also check for more appropriate error codes, to be friendly to
|
||||
* seccomp policies */
|
||||
r = xsetxattr(AT_FDCWD, sp_destroy, /* at_flags= */ 0, "user.testxxx", "1");
|
||||
if (ERRNO_IS_NEG_NOT_SUPPORTED(r) || r == -EPERM)
|
||||
return (cached = false);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to set test xattr on socket inode '%s': %m", sp_destroy);
|
||||
|
||||
return (cached = true);
|
||||
}
|
||||
|
||||
@@ -268,3 +268,5 @@ int socket_get_cookie(int fd, uint64_t *ret);
|
||||
void cmsg_close_all(struct msghdr *mh);
|
||||
|
||||
int tos_to_priority(uint8_t tos);
|
||||
|
||||
int socket_xattr_supported(void);
|
||||
|
||||
Reference in New Issue
Block a user