Skip to content

Commit 93f08e5

Browse files
thejhgregkh
authored andcommitted
udmabuf: fix racy memfd sealing check
commit 9cb189a upstream. The current check_memfd_seals() is racy: Since we first do check_memfd_seals() and then udmabuf_pin_folios() without holding any relevant lock across both, F_SEAL_WRITE can be set in between. This is problematic because we can end up holding pins to pages in a write-sealed memfd. Fix it using the inode lock, that's probably the easiest way. In the future, we might want to consider moving this logic into memfd, especially if anyone else wants to use memfd_pin_folios(). Reported-by: Julian Orth <ju.orth@gmail.com> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219106 Closes: https://lore.kernel.org/r/CAG48ez0w8HrFEZtJkfmkVKFDhE5aP7nz=obrimeTgpD+StkV9w@mail.gmail.com Fixes: fbb0de7 ("Add udmabuf misc device") Cc: stable@vger.kernel.org Signed-off-by: Jann Horn <jannh@google.com> Acked-by: Joel Fernandes (Google) <joel@joelfernandes.org> Acked-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241204-udmabuf-fixes-v2-1-23887289de1c@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ff56198 commit 93f08e5

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

drivers/dma-buf/udmabuf.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,14 +394,19 @@ static long udmabuf_create(struct miscdevice *device,
394394
goto err;
395395
}
396396

397+
/*
398+
* Take the inode lock to protect against concurrent
399+
* memfd_add_seals(), which takes this lock in write mode.
400+
*/
401+
inode_lock_shared(file_inode(memfd));
397402
ret = check_memfd_seals(memfd);
398-
if (ret < 0) {
399-
fput(memfd);
400-
goto err;
401-
}
403+
if (ret)
404+
goto out_unlock;
402405

403406
ret = udmabuf_pin_folios(ubuf, memfd, list[i].offset,
404407
list[i].size);
408+
out_unlock:
409+
inode_unlock_shared(file_inode(memfd));
405410
fput(memfd);
406411
if (ret)
407412
goto err;

0 commit comments

Comments
 (0)