• K
    PCI: Allow a NULL "parent" pointer in pci_bus_assign_domain_nr() · 54c6e2dd
    Krzysztof =?utf-8?Q?Ha=C5=82asa?= 提交于
    pci_create_root_bus() passes a "parent" pointer to
    pci_bus_assign_domain_nr().  When CONFIG_PCI_DOMAINS_GENERIC is defined,
    pci_bus_assign_domain_nr() dereferences that pointer.  Many callers of
    pci_create_root_bus() supply a NULL "parent" pointer, which leads to a NULL
    pointer dereference error.
    
    7c674700 ("PCI: Move domain assignment from arm64 to generic code")
    moved the "parent" dereference from arm64 to generic code.  Only arm64 used
    that code (because only arm64 defined CONFIG_PCI_DOMAINS_GENERIC), and it
    always supplied a valid "parent" pointer.  Other arches supplied NULL
    "parent" pointers but didn't defined CONFIG_PCI_DOMAINS_GENERIC, so they
    used a no-op version of pci_bus_assign_domain_nr().
    
    8c7d1474 ("ARM/PCI: Move to generic PCI domains") defined
    CONFIG_PCI_DOMAINS_GENERIC on ARM, and many ARM platforms use
    pci_common_init(), which supplies a NULL "parent" pointer.
    These platforms (cns3xxx, dove, footbridge, iop13xx, etc.) crash
    with a NULL pointer dereference like this while probing PCI:
    
      Unable to handle kernel NULL pointer dereference at virtual address 000000a4
      PC is at pci_bus_assign_domain_nr+0x10/0x84
      LR is at pci_create_root_bus+0x48/0x2e4
      Kernel panic - not syncing: Attempted to kill init!
    
    [bhelgaas: changelog, add "Reported:" and "Fixes:" tags]
    Reported: http://forum.doozan.com/read.php?2,17868,22070,quote=1
    Fixes: 8c7d1474 ("ARM/PCI: Move to generic PCI domains")
    Fixes: 7c674700 ("PCI: Move domain assignment from arm64 to generic code")
    Signed-off-by: NKrzysztof Hałasa <khalasa@piap.pl>
    Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
    Acked-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    CC: stable@vger.kernel.org	# v4.0+
    54c6e2dd
pci.c 126.0 KB