iommu/arm-smmu: Check smmu->impl pointer before dereferencing
authorWill Deacon <will@kernel.org>
Tue, 15 Jun 2021 18:35:46 +0000 (19:35 +0100)
committerWill Deacon <will@kernel.org>
Tue, 15 Jun 2021 18:35:46 +0000 (19:35 +0100)
Commit 0d97174aeadf ("iommu/arm-smmu: Implement ->probe_finalize()")
added a new optional ->probe_finalize callback to 'struct arm_smmu_impl'
but neglected to check that 'smmu->impl' is present prior to checking
if the new callback is present.

Add the missing check, which avoids dereferencing NULL when probing an
SMMU which doesn't require any implementation-specific callbacks:

  | Unable to handle kernel NULL pointer dereference at virtual address
  | 0000000000000070
  |
  | Call trace:
  |   arm_smmu_probe_finalize+0x14/0x48
  |   of_iommu_configure+0xe4/0x1b8
  |   of_dma_configure_id+0xf8/0x2d8
  |   pci_dma_configure+0x44/0x88
  |   really_probe+0xc0/0x3c0

Fixes: 0d97174aeadf ("iommu/arm-smmu: Implement ->probe_finalize()")
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu/arm-smmu.c

index d20ce4d57df216091a817aecaba07a7b372376dd..2fe73a88e500c435e800cb7203ced2b99c2eb564 100644 (file)
@@ -1458,7 +1458,7 @@ static void arm_smmu_probe_finalize(struct device *dev)
        cfg = dev_iommu_priv_get(dev);
        smmu = cfg->smmu;
 
-       if (smmu->impl->probe_finalize)
+       if (smmu->impl && smmu->impl->probe_finalize)
                smmu->impl->probe_finalize(smmu, dev);
 }