drivers/misc/open-dice: don't touch VM_MAYSHARE
authorDavid Hildenbrand <david@redhat.com>
Mon, 2 Jan 2023 16:08:56 +0000 (17:08 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 19 Jan 2023 01:12:57 +0000 (17:12 -0800)
A MAP_SHARED mapping always has VM_MAYSHARE set, and writable
(VM_MAYWRITE) MAP_SHARED mappings have VM_SHARED set as well.  To identify
a MAP_SHARED mapping, it's sufficient to look at VM_MAYSHARE.

We cannot have VM_MAYSHARE|VM_WRITE mappings without having VM_SHARED set.
Consequently, current code will never actually end up clearing
VM_MAYSHARE and that code is confusing, because nobody is supposed to mess
with VM_MAYWRITE.

Let's clean it up and restructure the code. No functional change intended.

Link: https://lkml.kernel.org/r/20230102160856.500584-4-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Nicolas Pitre <nico@fluxnic.net>
Cc: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/misc/open-dice.c

index c61be34..9dda47b 100644 (file)
@@ -90,15 +90,13 @@ static int open_dice_mmap(struct file *filp, struct vm_area_struct *vma)
 {
        struct open_dice_drvdata *drvdata = to_open_dice_drvdata(filp);
 
-       /* Do not allow userspace to modify the underlying data. */
-       if ((vma->vm_flags & VM_WRITE) && (vma->vm_flags & VM_SHARED))
-               return -EPERM;
-
-       /* Ensure userspace cannot acquire VM_WRITE + VM_SHARED later. */
-       if (vma->vm_flags & VM_WRITE)
-               vma->vm_flags &= ~VM_MAYSHARE;
-       else if (vma->vm_flags & VM_SHARED)
+       if (vma->vm_flags & VM_MAYSHARE) {
+               /* Do not allow userspace to modify the underlying data. */
+               if (vma->vm_flags & VM_WRITE)
+                       return -EPERM;
+               /* Ensure userspace cannot acquire VM_WRITE later. */
                vma->vm_flags &= ~VM_MAYWRITE;
+       }
 
        /* Create write-combine mapping so all clients observe a wipe. */
        vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);