mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
usb: gadget: f_fs: Fix fence cleanup in ffs_dmabuf_transfer() error paths
The error paths for endpoint-disabled (ESHUTDOWN) and request-allocation
failure (ENOMEM) in ffs_dmabuf_transfer() jump to err_fence_put which
calls dma_fence_put() on the fence. However, at that point the fence has
only been kmalloc'd — dma_fence_init() has not been called yet, so the
refcount and the fence ops are uninitialized. Calling dma_fence_put() on
such an object leads to undefined behavior.
Use kfree() instead, since the fence is just a plain allocation at this
stage, and rename the label to err_fence_free to reflect the actual
cleanup action.
Fixes: 7b07a2a7ca ("usb: gadget: functionfs: Add DMABUF import interface")
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
Reviewed-by: Paul Cercueil <paul@crapouillou.net>
Link: https://patch.msgid.link/20260612-fix-f_fs-fence-cleanup-v1-1-79f489b0efe9@analog.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
844d83d596
commit
621707dc67
|
|
@ -1682,13 +1682,13 @@ static int ffs_dmabuf_transfer(struct file *file,
|
|||
/* In the meantime, endpoint got disabled or changed. */
|
||||
if (epfile->ep != ep) {
|
||||
ret = -ESHUTDOWN;
|
||||
goto err_fence_put;
|
||||
goto err_fence_free;
|
||||
}
|
||||
|
||||
usb_req = usb_ep_alloc_request(ep->ep, GFP_ATOMIC);
|
||||
if (!usb_req) {
|
||||
ret = -ENOMEM;
|
||||
goto err_fence_put;
|
||||
goto err_fence_free;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1736,9 +1736,9 @@ static int ffs_dmabuf_transfer(struct file *file,
|
|||
|
||||
return ret;
|
||||
|
||||
err_fence_put:
|
||||
err_fence_free:
|
||||
spin_unlock_irq(&epfile->ffs->eps_lock);
|
||||
dma_fence_put(&fence->base);
|
||||
kfree(fence);
|
||||
err_resv_unlock:
|
||||
dma_resv_unlock(dmabuf->resv);
|
||||
err_attachment_put:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user