]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dmaengine: idxd: cdev: Fix uninitialized use of sva in idxd_cdev_open
authorPurva Yeshi <purvayeshi550@gmail.com>
Thu, 10 Apr 2025 11:02:16 +0000 (16:32 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Jun 2025 12:45:09 +0000 (14:45 +0200)
[ Upstream commit 97994333de2b8062d2df4e6ce0dc65c2dc0f40dc ]

Fix Smatch-detected issue:
drivers/dma/idxd/cdev.c:321 idxd_cdev_open() error:
uninitialized symbol 'sva'.

'sva' pointer may be used uninitialized in error handling paths.
Specifically, if PASID support is enabled and iommu_sva_bind_device()
returns an error, the code jumps to the cleanup label and attempts to
call iommu_sva_unbind_device(sva) without ensuring that sva was
successfully assigned. This triggers a Smatch warning about an
uninitialized symbol.

Initialize sva to NULL at declaration and add a check using
IS_ERR_OR_NULL() before unbinding the device. This ensures the
function does not use an invalid or uninitialized pointer during
cleanup.

Signed-off-by: Purva Yeshi <purvayeshi550@gmail.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Link: https://lore.kernel.org/r/20250410110216.21592-1-purvayeshi550@gmail.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/dma/idxd/cdev.c

index cd57067e8218025571140a347e6351f8c236a508..6d12033649f817368df69a5e8864775073a47a24 100644 (file)
@@ -222,7 +222,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp)
        struct idxd_wq *wq;
        struct device *dev, *fdev;
        int rc = 0;
-       struct iommu_sva *sva;
+       struct iommu_sva *sva = NULL;
        unsigned int pasid;
        struct idxd_cdev *idxd_cdev;
 
@@ -317,7 +317,7 @@ failed_set_pasid:
        if (device_user_pasid_enabled(idxd))
                idxd_xa_pasid_remove(ctx);
 failed_get_pasid:
-       if (device_user_pasid_enabled(idxd))
+       if (device_user_pasid_enabled(idxd) && !IS_ERR_OR_NULL(sva))
                iommu_sva_unbind_device(sva);
 failed:
        mutex_unlock(&wq->wq_lock);