Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: add F_DUPDFD_QUERY selftests

Add simple selftests for the new F_DUPFD_QUERY fcntl().

Signed-off-by: Christian Brauner <brauner@kernel.org>

+54 -1
+54 -1
tools/testing/selftests/core/close_range_test.c
··· 17 17 #include "../kselftest_harness.h" 18 18 #include "../clone3/clone3_selftests.h" 19 19 20 + 21 + #ifndef F_LINUX_SPECIFIC_BASE 22 + #define F_LINUX_SPECIFIC_BASE 1024 23 + #endif 24 + 25 + #ifndef F_DUPFD_QUERY 26 + #define F_DUPFD_QUERY (F_LINUX_SPECIFIC_BASE + 3) 27 + #endif 28 + 20 29 static inline int sys_close_range(unsigned int fd, unsigned int max_fd, 21 30 unsigned int flags) 22 31 { ··· 52 43 EXPECT_EQ(-1, sys_close_range(open_fds[0], open_fds[100], -1)) { 53 44 if (errno == ENOSYS) 54 45 SKIP(return, "close_range() syscall not supported"); 46 + } 47 + 48 + for (i = 0; i < 100; i++) { 49 + ret = fcntl(open_fds[i], F_DUPFD_QUERY, open_fds[i + 1]); 50 + if (ret < 0) { 51 + EXPECT_EQ(errno, EINVAL); 52 + } else { 53 + EXPECT_EQ(ret, 0); 54 + } 55 55 } 56 56 57 57 EXPECT_EQ(0, sys_close_range(open_fds[0], open_fds[50], 0)); ··· 376 358 */ 377 359 TEST(close_range_cloexec_syzbot) 378 360 { 379 - int fd1, fd2, fd3, flags, ret, status; 361 + int fd1, fd2, fd3, fd4, flags, ret, status; 380 362 pid_t pid; 381 363 struct __clone_args args = { 382 364 .flags = CLONE_FILES, ··· 389 371 390 372 fd2 = dup2(fd1, 1000); 391 373 EXPECT_GT(fd2, 0); 374 + 375 + flags = fcntl(fd1, F_DUPFD_QUERY, fd2); 376 + if (flags < 0) { 377 + EXPECT_EQ(errno, EINVAL); 378 + } else { 379 + EXPECT_EQ(flags, 1); 380 + } 392 381 393 382 pid = sys_clone3(&args, sizeof(args)); 394 383 ASSERT_GE(pid, 0); ··· 420 395 421 396 fd3 = dup2(fd1, 42); 422 397 EXPECT_GT(fd3, 0); 398 + 399 + flags = fcntl(fd1, F_DUPFD_QUERY, fd3); 400 + if (flags < 0) { 401 + EXPECT_EQ(errno, EINVAL); 402 + } else { 403 + EXPECT_EQ(flags, 1); 404 + } 405 + 406 + 423 407 424 408 /* 425 409 * Duplicating the file descriptor must remove the ··· 460 426 fd3 = dup2(fd1, 42); 461 427 EXPECT_GT(fd3, 0); 462 428 429 + flags = fcntl(fd1, F_DUPFD_QUERY, fd3); 430 + if (flags < 0) { 431 + EXPECT_EQ(errno, EINVAL); 432 + } else { 433 + EXPECT_EQ(flags, 1); 434 + } 435 + 436 + fd4 = open("/dev/null", O_RDWR); 437 + EXPECT_GT(fd4, 0); 438 + 439 + /* Same inode, different file pointers. */ 440 + flags = fcntl(fd1, F_DUPFD_QUERY, fd4); 441 + if (flags < 0) { 442 + EXPECT_EQ(errno, EINVAL); 443 + } else { 444 + EXPECT_EQ(flags, 0); 445 + } 446 + 463 447 flags = fcntl(fd3, F_GETFD); 464 448 EXPECT_GT(flags, -1); 465 449 EXPECT_EQ(flags & FD_CLOEXEC, 0); ··· 485 433 EXPECT_EQ(close(fd1), 0); 486 434 EXPECT_EQ(close(fd2), 0); 487 435 EXPECT_EQ(close(fd3), 0); 436 + EXPECT_EQ(close(fd4), 0); 488 437 } 489 438 490 439 /*