[PATCH 4/4] selftests/nolibc: test open mode handling

Thomas Weißschuh
2026-04-29T14:45:26Z

Add a selftest for the new O_TMPFILE open mode handling.
While O_CREAT or openat() are not tested, the code is the same,
so assume these also work.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
tools/testing/selftests/nolibc/nolibc-test.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)

diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c
index 08610cacf030..6a03781fffab 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -1300,6 +1300,28 @@ int test_openat(void)
return 0;
}

+int test_open_mode(void)
+{
+ const mode_t mode = 0444;
+ struct stat stat_buf;
+ int fd, ret;
+
+ fd = open("/tmp", O_TMPFILE | O_RDWR, mode);
+ if (fd == -1)
+ return -1;
+
+ ret = fstat(fd, &stat_buf);
+ close(fd);
+
+ if (ret == -1)
+ return -1;
+
+ if ((stat_buf.st_mode & 0777) != mode)
+ return -1;
+
+ return 0;
+}
+
int test_nolibc_enosys(void)
{
if (true)
@@ -1535,6 +1557,7 @@ int run_syscall(int min, int max)
CASE_TEST(open_tty); EXPECT_SYSNE(1, tmp = open("/dev/null", O_RDONLY), -1); if (tmp != -1) close(tmp); break;
CASE_TEST(open_blah); EXPECT_SYSER(1, tmp = open("/proc/self/blah", O_RDONLY), -1, ENOENT); if (tmp != -1) close(tmp); break;
CASE_TEST(openat_dir); EXPECT_SYSZR(1, test_openat()); break;
+ CASE_TEST(open_mode); EXPECT_SYSZR(1, test_open_mode()); break;
CASE_TEST(pipe); EXPECT_SYSZR(1, test_pipe()); break;
CASE_TEST(poll_null); EXPECT_SYSZR(1, poll(NULL, 0, 0)); break;
CASE_TEST(poll_stdout); EXPECT_SYSNE(1, ({ struct pollfd fds = { 1, POLLOUT, 0}; poll(&fds, 1, 0); }), -1); break;

--
2.54.0