]> xenbits.xensource.com Git - people/aperard/linux.git/commitdiff
selftests/seccomp: user_notification_addfd check nextfd is available
authorTerry Tritton <terry.tritton@linaro.org>
Wed, 24 Jan 2024 14:13:57 +0000 (14:13 +0000)
committerKees Cook <keescook@chromium.org>
Thu, 1 Feb 2024 18:16:03 +0000 (10:16 -0800)
Currently the user_notification_addfd test checks what the next expected
file descriptor will be by incrementing a variable nextfd. This does not
account for file descriptors that may already be open before the test is
started and will cause the test to fail if any exist.

Replace nextfd++ with a function get_next_fd which will check and return
the next available file descriptor.

Signed-off-by: Terry Tritton <terry.tritton@linaro.org>
Link: https://lore.kernel.org/r/20240124141357.1243457-4-terry.tritton@linaro.org
Signed-off-by: Kees Cook <keescook@chromium.org>
tools/testing/selftests/seccomp/seccomp_bpf.c

index da11b95b88721b17e2584a7355483a75556d7451..cacf6507f6905519e88a262e8398323c53b2c34b 100644 (file)
@@ -4044,6 +4044,16 @@ TEST(user_notification_filter_empty_threaded)
        EXPECT_GT((pollfd.revents & POLLHUP) ?: 0, 0);
 }
 
+
+int get_next_fd(int prev_fd)
+{
+       for (int i = prev_fd + 1; i < FD_SETSIZE; ++i) {
+               if (fcntl(i, F_GETFD) == -1)
+                       return i;
+       }
+       _exit(EXIT_FAILURE);
+}
+
 TEST(user_notification_addfd)
 {
        pid_t pid;
@@ -4060,7 +4070,7 @@ TEST(user_notification_addfd)
        /* There may be arbitrary already-open fds at test start. */
        memfd = memfd_create("test", 0);
        ASSERT_GE(memfd, 0);
-       nextfd = memfd + 1;
+       nextfd = get_next_fd(memfd);
 
        ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
        ASSERT_EQ(0, ret) {
@@ -4071,7 +4081,8 @@ TEST(user_notification_addfd)
        /* Check that the basic notification machinery works */
        listener = user_notif_syscall(__NR_getppid,
                                      SECCOMP_FILTER_FLAG_NEW_LISTENER);
-       ASSERT_EQ(listener, nextfd++);
+       ASSERT_EQ(listener, nextfd);
+       nextfd = get_next_fd(nextfd);
 
        pid = fork();
        ASSERT_GE(pid, 0);
@@ -4126,14 +4137,16 @@ TEST(user_notification_addfd)
 
        /* Verify we can set an arbitrary remote fd */
        fd = ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd);
-       EXPECT_EQ(fd, nextfd++);
+       EXPECT_EQ(fd, nextfd);
+       nextfd = get_next_fd(nextfd);
        EXPECT_EQ(filecmp(getpid(), pid, memfd, fd), 0);
 
        /* Verify we can set an arbitrary remote fd with large size */
        memset(&big, 0x0, sizeof(big));
        big.addfd = addfd;
        fd = ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD_BIG, &big);
-       EXPECT_EQ(fd, nextfd++);
+       EXPECT_EQ(fd, nextfd);
+       nextfd = get_next_fd(nextfd);
 
        /* Verify we can set a specific remote fd */
        addfd.newfd = 42;
@@ -4171,7 +4184,8 @@ TEST(user_notification_addfd)
         * Child has earlier "low" fds and now 42, so we expect the next
         * lowest available fd to be assigned here.
         */
-       EXPECT_EQ(fd, nextfd++);
+       EXPECT_EQ(fd, nextfd);
+       nextfd = get_next_fd(nextfd);
        ASSERT_EQ(filecmp(getpid(), pid, memfd, fd), 0);
 
        /*