• Niklas Cassel's avatar
    PCI: dwc: Fix dw_pcie_ops NULL pointer dereference · 794a8604
    Niklas Cassel authored
    Fix a crash from dereferencing a NULL dw_pcie_ops pointer.  For example,
    on ARTPEC-6:
    
      Unable to handle kernel NULL pointer dereference at virtual address 00000004
      pgd = c0204000
      [00000004] *pgd=00000000
      Internal error: Oops: 5 [#1] SMP ARM
      Modules linked in:
      CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.11.0-rc3-next-20170321 #1
      Hardware name: Axis ARTPEC-6 Platform
      task: db098000 task.stack: db096000
      PC is at dw_pcie_writel_dbi+0x2c/0xd0
    
    Prior to 442ec4c0 ("PCI: dwc: all: Split struct pcie_port into
    host-only and core structures"), every driver had a struct pcie_host_ops
    with function pointers, typically used as:
    
      if (pp->ops->readl_rc)
        return pp->ops->readl_rc(...);
    
    442ec4c0 split struct pcie_host_ops into two pieces: struct
    dw_pcie_host_ops and struct dw_pcie_ops, so the above became:
    
      if (pci->ops->readl_dbi)
        return pci->ops->readl_dbi(...);
    
    But pcie-artpec6.c and pcie-designware-plat.c don't need the dw_pcie_ops
    pointers and didn't supply a pci->ops struct, which leads to NULL pointer
    dereferences.
    
    Supply an empty struct dw_pcie_ops to avoid the NULL pointer dereferences.
    
    [bhelgaas: changelog]
    Fixes: 442ec4c0 ("PCI: dwc: all: Split struct pcie_port into host-only and core structures")
    Signed-off-by: default avatarNiklas Cassel <niklas.cassel@axis.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Acked-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
    Acked-by: default avatarJoao Pinto <jpinto@synopsys.com>
    794a8604
pcie-artpec6.c 7.83 KB