Am Mi., 18. Juni 2025 um 22:54 Uhr schrieb Christian Brauner <brauner@xxxxxxxxxx>: > > Add tests for extended attribute support on pidfds. > > Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@xxxxxxxxxxxxx> > --- > tools/testing/selftests/pidfd/.gitignore | 1 + > tools/testing/selftests/pidfd/Makefile | 3 +- > tools/testing/selftests/pidfd/pidfd_xattr_test.c | 97 ++++++++++++++++++++++++ > 3 files changed, 100 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/pidfd/.gitignore b/tools/testing/selftests/pidfd/.gitignore > index 0406a065deb4..bc4130506eda 100644 > --- a/tools/testing/selftests/pidfd/.gitignore > +++ b/tools/testing/selftests/pidfd/.gitignore > @@ -10,3 +10,4 @@ pidfd_file_handle_test > pidfd_bind_mount > pidfd_info_test > pidfd_exec_helper > +pidfd_xattr_test > diff --git a/tools/testing/selftests/pidfd/Makefile b/tools/testing/selftests/pidfd/Makefile > index fcbefc0d77f6..c9fd5023ef15 100644 > --- a/tools/testing/selftests/pidfd/Makefile > +++ b/tools/testing/selftests/pidfd/Makefile > @@ -3,7 +3,8 @@ CFLAGS += -g $(KHDR_INCLUDES) -pthread -Wall > > TEST_GEN_PROGS := pidfd_test pidfd_fdinfo_test pidfd_open_test \ > pidfd_poll_test pidfd_wait pidfd_getfd_test pidfd_setns_test \ > - pidfd_file_handle_test pidfd_bind_mount pidfd_info_test > + pidfd_file_handle_test pidfd_bind_mount pidfd_info_test \ > + pidfd_xattr_test > > TEST_GEN_PROGS_EXTENDED := pidfd_exec_helper > > diff --git a/tools/testing/selftests/pidfd/pidfd_xattr_test.c b/tools/testing/selftests/pidfd/pidfd_xattr_test.c > new file mode 100644 > index 000000000000..00d400ac515b > --- /dev/null > +++ b/tools/testing/selftests/pidfd/pidfd_xattr_test.c > @@ -0,0 +1,97 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#define _GNU_SOURCE > +#include <errno.h> > +#include <fcntl.h> > +#include <limits.h> > +#include <linux/types.h> > +#include <poll.h> > +#include <pthread.h> > +#include <sched.h> > +#include <signal.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > +#include <syscall.h> > +#include <sys/prctl.h> > +#include <sys/wait.h> > +#include <unistd.h> > +#include <sys/socket.h> > +#include <linux/kcmp.h> > +#include <sys/stat.h> > +#include <sys/xattr.h> > + > +#include "pidfd.h" > +#include "../kselftest_harness.h" > + > +FIXTURE(pidfs_xattr) > +{ > + pid_t child_pid; > + int child_pidfd; > +}; > + > +FIXTURE_SETUP(pidfs_xattr) > +{ > + self->child_pid = create_child(&self->child_pidfd, CLONE_NEWUSER | CLONE_NEWPID); > + EXPECT_GE(self->child_pid, 0); > + > + if (self->child_pid == 0) > + _exit(EXIT_SUCCESS); > +} > + > +FIXTURE_TEARDOWN(pidfs_xattr) > +{ > + sys_waitid(P_PID, self->child_pid, NULL, WEXITED); > +} > + > +TEST_F(pidfs_xattr, set_get_list_xattr_multiple) > +{ > + int ret, i; > + char xattr_name[32]; > + char xattr_value[32]; > + char buf[32]; > + const int num_xattrs = 10; > + char list[PATH_MAX] = {}; > + > + for (i = 0; i < num_xattrs; i++) { > + snprintf(xattr_name, sizeof(xattr_name), "trusted.testattr%d", i); > + snprintf(xattr_value, sizeof(xattr_value), "testvalue%d", i); > + ret = fsetxattr(self->child_pidfd, xattr_name, xattr_value, strlen(xattr_value), 0); > + ASSERT_EQ(ret, 0); > + } > + > + for (i = 0; i < num_xattrs; i++) { > + snprintf(xattr_name, sizeof(xattr_name), "trusted.testattr%d", i); > + snprintf(xattr_value, sizeof(xattr_value), "testvalue%d", i); > + memset(buf, 0, sizeof(buf)); > + ret = fgetxattr(self->child_pidfd, xattr_name, buf, sizeof(buf)); > + ASSERT_EQ(ret, strlen(xattr_value)); > + ASSERT_EQ(strcmp(buf, xattr_value), 0); > + } > + > + ret = flistxattr(self->child_pidfd, list, sizeof(list)); > + ASSERT_GT(ret, 0); > + for (i = 0; i < num_xattrs; i++) { > + snprintf(xattr_name, sizeof(xattr_name), "trusted.testattr%d", i); > + bool found = false; > + for (char *it = list; it < list + ret; it += strlen(it) + 1) { > + if (strcmp(it, xattr_name)) > + continue; > + found = true; > + break; > + } > + ASSERT_TRUE(found); > + } > + > + for (i = 0; i < num_xattrs; i++) { > + snprintf(xattr_name, sizeof(xattr_name), "trusted.testattr%d", i); > + ret = fremovexattr(self->child_pidfd, xattr_name); > + ASSERT_EQ(ret, 0); > + > + ret = fgetxattr(self->child_pidfd, xattr_name, buf, sizeof(buf)); > + ASSERT_EQ(ret, -1); > + ASSERT_EQ(errno, ENODATA); > + } > +} > + > +TEST_HARNESS_MAIN > > -- > 2.47.2 >