lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 013/149] misc: alcor_pci: fix null-ptr-deref when there is no PCI bridge
    Date
    From: Tong Zhang <ztong0001@gmail.com>

    [ Upstream commit 3ce3e45cc333da707d4d6eb433574b990bcc26f5 ]

    There is an issue with the ASPM(optional) capability checking function.
    A device might be attached to root complex directly, in this case,
    bus->self(bridge) will be NULL, thus priv->parent_pdev is NULL.
    Since alcor_pci_init_check_aspm(priv->parent_pdev) checks the PCI link's
    ASPM capability and populate parent_cap_off, which will be used later by
    alcor_pci_aspm_ctrl() to dynamically turn on/off device, what we can do
    here is to avoid checking the capability if we are on the root complex.
    This will make pdev_cap_off 0 and alcor_pci_aspm_ctrl() will simply
    return when bring called, effectively disable ASPM for the device.

    [ 1.246492] BUG: kernel NULL pointer dereference, address: 00000000000000c0
    [ 1.248731] RIP: 0010:pci_read_config_byte+0x5/0x40
    [ 1.253998] Call Trace:
    [ 1.254131] ? alcor_pci_find_cap_offset.isra.0+0x3a/0x100 [alcor_pci]
    [ 1.254476] alcor_pci_probe+0x169/0x2d5 [alcor_pci]

    Co-developed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Link: https://lore.kernel.org/r/20210513040732.1310159-1-ztong0001@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/misc/cardreader/alcor_pci.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    diff --git a/drivers/misc/cardreader/alcor_pci.c b/drivers/misc/cardreader/alcor_pci.c
    index 259fe1dfec03..afd409a5efae 100644
    --- a/drivers/misc/cardreader/alcor_pci.c
    +++ b/drivers/misc/cardreader/alcor_pci.c
    @@ -133,7 +133,13 @@ static void alcor_pci_init_check_aspm(struct alcor_pci_priv *priv)
    u32 val32;

    priv->pdev_cap_off = alcor_pci_find_cap_offset(priv, priv->pdev);
    - priv->parent_cap_off = alcor_pci_find_cap_offset(priv,
    + /*
    + * A device might be attached to root complex directly and
    + * priv->parent_pdev will be NULL. In this case we don't check its
    + * capability and disable ASPM completely.
    + */
    + if (!priv->parent_pdev)
    + priv->parent_cap_off = alcor_pci_find_cap_offset(priv,
    priv->parent_pdev);

    if ((priv->pdev_cap_off == 0) || (priv->parent_cap_off == 0)) {
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-19 19:11    [W:3.263 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site