From: Ackerley Tng <[email protected]>

Add test coverage verifying that passing a directory file descriptor
from an unsupported filesystem without provider operations as a resource
file fails with EOPNOTSUPP.

Signed-off-by: Ackerley Tng <[email protected]>
---
 tools/testing/selftests/kvm/guest_memfd_test.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c 
b/tools/testing/selftests/kvm/guest_memfd_test.c
index 84b958b9ef715..31bc74c4c26bd 100644
--- a/tools/testing/selftests/kvm/guest_memfd_test.c
+++ b/tools/testing/selftests/kvm/guest_memfd_test.c
@@ -436,6 +436,27 @@ static void test_resource_fd_invalid(struct kvm_vm *vm)
        TEST_ASSERT_EQ(errno, EBADF);
 }
 
+static void test_resource_fd_unsupported_fs(struct kvm_vm *vm)
+{
+       int fd, file_fd;
+
+       /*
+        * Passing an FD from an unsupported filesystem without provider ops
+        * (e.g. the /proc mount root directory) is rejected by KVM with
+        * EOPNOTSUPP.
+        */
+       file_fd = open("/proc", O_DIRECTORY | O_RDONLY);
+       TEST_ASSERT(file_fd >= 0, "open /proc failed");
+
+       fd = __vm_create_guest_memfd_resource(vm, page_size,
+                                             GUEST_MEMFD_FLAG_USE_RESOURCE,
+                                             file_fd);
+       TEST_ASSERT(fd < 0, "guest_memfd with /proc fd should fail");
+       TEST_ASSERT_EQ(errno, EOPNOTSUPP);
+
+       close(file_fd);
+}
+
 #define ____gmem_test(__test, __vm, __flags, __gmem_size, args...)     \
 do {                                                                   \
        int fd = vm_create_guest_memfd(__vm, __gmem_size, __flags);     \
@@ -495,6 +516,7 @@ static void test_guest_memfd(unsigned long vm_type)
        test_guest_memfd_flags(vm);
 
        test_resource_fd_invalid(vm);
+       test_resource_fd_unsupported_fs(vm);
 
        __test_guest_memfd(vm, 0);
 

-- 
2.56.0.rc1.315.gc6ed9934b7-goog



Reply via email to