Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dmaengine: idxd: cdev: Fix uninitialized use of sva in idxd_cdev_open

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>

authored by

Purva Yeshi and committed by
Vinod Koul
97994333 0af2f6be

+2 -2
+2 -2
drivers/dma/idxd/cdev.c
··· 222 222 struct idxd_wq *wq; 223 223 struct device *dev, *fdev; 224 224 int rc = 0; 225 - struct iommu_sva *sva; 225 + struct iommu_sva *sva = NULL; 226 226 unsigned int pasid; 227 227 struct idxd_cdev *idxd_cdev; 228 228 ··· 317 317 if (device_user_pasid_enabled(idxd)) 318 318 idxd_xa_pasid_remove(ctx); 319 319 failed_get_pasid: 320 - if (device_user_pasid_enabled(idxd)) 320 + if (device_user_pasid_enabled(idxd) && !IS_ERR_OR_NULL(sva)) 321 321 iommu_sva_unbind_device(sva); 322 322 failed: 323 323 mutex_unlock(&wq->wq_lock);