lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <cf4f6457-0aac-47ba-bbe6-ec755c62c4a6@yandex.ru>
Date: Mon, 25 Nov 2024 12:05:49 +0300
From: stsp <stsp2@...dex.ru>
To: Linux kernel <linux-kernel@...r.kernel.org>
Cc: Muhammad Usama Anjum <usama.anjum@...labora.com>,
 Peter Xu <peterx@...hat.com>
Subject: Re: userfaultfd: two-step UFFDIO_API always gives -EINVAL

23.11.2024 18:13, stsp пишет:
> Hello.
>
> I tried to use userfaultfd and got
> that strange result: when I first do
> UFFDIO_API ioctl with features = 0,
> it succeeds. I check the needed
> features, and they are all in place.
> But on the second step, where I
> request the needed features,
> UFFDIO_API gives -EINVAL no matter
> what features I requested (or even
> set features to 0 again).
With the test patch below, the
problem can be reproduced. All
the code in selftests suggest
that UFFDIO_API should not be
called twice, whereas man page
says this:

```
        After the userfaultfd object is created with userfaultfd(), the 
applica‐
        tion must enable it using the UFFDIO_API ioctl(2) operation. 
This oper‐
        ation allows a two-step handshake between the kernel and user  
space  to
        determine what API version and features the kernel supports, and 
then to
        enable  those  features  user  space wants.
```
But the second part doesn't work and
is never being tested in selftests.
So is this a documentation problem?

This patch can be used to make
sure the second call doesn't work:

--- a/tools/testing/selftests/mm/uffd-unit-tests.c
+++ b/tools/testing/selftests/mm/uffd-unit-tests.c
@@ -171,6 +171,14 @@ static int test_uffd_api(bool use_dev)
                 goto out;
         }

+       /* Request valid feature via UFFDIO_API */
+       uffdio_api.api = UFFD_API;
+       uffdio_api.features = UFFD_FEATURE_PAGEFAULT_FLAG_WP;
+       if (ioctl(uffd, UFFDIO_API, &uffdio_api)) {
+               uffd_test_fail("UFFDIO_API should succeed but failed");
+               exit(1);
+       }
+
         uffd_test_pass();
  out:
         close(uffd);

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ