Linux Kernel Selftest development
 help / color / mirror / Atom feed
* [PATCH 1/1] selftests/cachestat: add fault-path errno coverage for cachestat
@ 2026-08-08 14:03 Mohammed Rizwan Kaniyate
  0 siblings, 0 replies; only message in thread
From: Mohammed Rizwan Kaniyate @ 2026-08-08 14:03 UTC (permalink / raw)
  To: nphamcs, shuah, hannes
  Cc: linux-kselftest, linux-kernel, Mohammed Rizwan Kaniyate

From: Mohammed Rizwan Kaniyate <mrizwank004@gmail.com>

Add a dedicated fault test for cachestat argument
validation and errno behaviour.
The test verifies EBADF, EFAULT and EINVAL case
using a common helper that
resets/checks errno and reports mismatch.

Signed-off-by: Mohammed Rizwan Kaniyate <mrizwank004@gmail.com>
---
 .../selftests/cachestat/test_cachestat.c      | 56 +++++++++++++++++--
 1 file changed, 50 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/cachestat/test_cachestat.c b/tools/testing/selftests/cachestat/test_cachestat.c
index 542cd09cb4434..6b23022b4ec76 100644
--- a/tools/testing/selftests/cachestat/test_cachestat.c
+++ b/tools/testing/selftests/cachestat/test_cachestat.c
@@ -18,7 +18,7 @@
 
 #include "kselftest.h"
 
-#define NR_TESTS	9
+#define NR_TESTS	10
 
 static const char * const dev_files[] = {
 	"/dev/zero", "/dev/null", "/dev/urandom",
@@ -294,23 +294,67 @@ bool run_cachestat_test(enum file_type type)
 	return ret;
 }
 
+bool expect_cachestat_errno(int fd, struct cachestat_range *csr, struct cachestat *cs,
+	unsigned int flags, int expected_errno, const char *desc)
+{
+	int sys_ret;
+
+	errno = 0;
+
+	sys_ret = syscall(__NR_cachestat, fd, csr, cs, flags);
+
+	if (sys_ret == -1 && errno == expected_errno) {
+		ksft_print_msg("cachestat test success for %s\n", desc);
+	} else {
+		ksft_print_msg("cachestat test fail : %s: ret=%d, errno=%d expected_errno=%d\n",
+			desc, sys_ret, errno, expected_errno);
+		return false;
+	}
+
+	return true;
+}
+
+bool test_cachestat_faults(void)
+{
+	bool ret = true;
+	struct cachestat cs = {0};
+	struct cachestat_range cr = {0, 0};
+	// Test that the cachestat syscall fails with a bad file descriptor
+	ret &= expect_cachestat_errno(-1, &cr, &cs, 0, EBADF, "bad file descriptor");
+
+	// Fails with a NULL cacherange
+	ret &= expect_cachestat_errno(0, NULL, &cs, 0, EFAULT, "NULL range");
+	// Fails with a NULL result
+	ret &= expect_cachestat_errno(0, &cr, NULL, 0, EFAULT, "NULL result");
+	// Fails with invalid user space address
+	ret &= expect_cachestat_errno(0, (struct cachestat_range *)0x1, &cs,
+		0, EFAULT, "invalid range address");
+	// Fails with invalid user space address
+	ret &= expect_cachestat_errno(0, &cr, (struct cachestat *)0x1, 0,
+		EFAULT, "invalid result address");
+	// Fails with invalid flag
+	ret &= expect_cachestat_errno(0, &cr, &cs, 1, EINVAL, "invalid flags");
+
+	return ret;
+}
+
 int main(void)
 {
 	int ret;
 
 	ksft_print_header();
 
+	errno = 0;
 	ret = syscall(__NR_cachestat, -1, NULL, NULL, 0);
 	if (ret == -1 && errno == ENOSYS)
 		ksft_exit_skip("cachestat syscall not available\n");
-
+	ret = 0;
 	ksft_set_plan(NR_TESTS);
 
-	if (ret == -1 && errno == EBADF) {
-		ksft_test_result_pass("bad file descriptor recognized\n");
-		ret = 0;
+	if (test_cachestat_faults()) {
+		ksft_test_result_pass("cachestat syscall fault tests passed\n");
 	} else {
-		ksft_test_result_fail("bad file descriptor ignored\n");
+		ksft_test_result_fail("cachestat syscall fault tests failed\n");
 		ret = 1;
 	}
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-08-08 14:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-08 14:03 [PATCH 1/1] selftests/cachestat: add fault-path errno coverage for cachestat Mohammed Rizwan Kaniyate

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox