lkml.org 
[lkml]   [2021]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 087/104] ethernet: sun: niu: fix missing checks of niu_pci_eeprom_read()
    Date
    From: Du Cheng <ducheng2@gmail.com>

    commit e6e337708c22f80824b82d4af645f20715730ad0 upstream.

    niu_pci_eeprom_read() may fail, so add checks to its return value and
    propagate the error up the callstack.

    An examination of the callstack up to niu_pci_eeprom_read shows that:

    niu_pci_eeprom_read() // returns int
    niu_pci_vpd_scan_props() // returns int
    niu_pci_vpd_fetch() // returns *void*
    niu_get_invariants() // returns int

    since niu_pci_vpd_fetch() returns void which breaks the bubbling up,
    change its return type to int so that error is propagated upwards.

    Signed-off-by: Du Cheng <ducheng2@gmail.com>
    Cc: Shannon Nelson <shannon.lee.nelson@gmail.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-24-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/sun/niu.c | 34 ++++++++++++++++++++++++----------
    1 file changed, 24 insertions(+), 10 deletions(-)

    --- a/drivers/net/ethernet/sun/niu.c
    +++ b/drivers/net/ethernet/sun/niu.c
    @@ -8097,6 +8097,8 @@ static int niu_pci_vpd_scan_props(struct
    start += 3;

    prop_len = niu_pci_eeprom_read(np, start + 4);
    + if (prop_len < 0)
    + return prop_len;
    err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64);
    if (err < 0)
    return err;
    @@ -8141,8 +8143,12 @@ static int niu_pci_vpd_scan_props(struct
    netif_printk(np, probe, KERN_DEBUG, np->dev,
    "VPD_SCAN: Reading in property [%s] len[%d]\n",
    namebuf, prop_len);
    - for (i = 0; i < prop_len; i++)
    - *prop_buf++ = niu_pci_eeprom_read(np, off + i);
    + for (i = 0; i < prop_len; i++) {
    + err = niu_pci_eeprom_read(np, off + i);
    + if (err < 0)
    + return err;
    + *prop_buf++ = err;
    + }
    }

    start += len;
    @@ -8152,14 +8158,14 @@ static int niu_pci_vpd_scan_props(struct
    }

    /* ESPC_PIO_EN_ENABLE must be set */
    -static void niu_pci_vpd_fetch(struct niu *np, u32 start)
    +static int niu_pci_vpd_fetch(struct niu *np, u32 start)
    {
    u32 offset;
    int err;

    err = niu_pci_eeprom_read16_swp(np, start + 1);
    if (err < 0)
    - return;
    + return err;

    offset = err + 3;

    @@ -8168,12 +8174,14 @@ static void niu_pci_vpd_fetch(struct niu
    u32 end;

    err = niu_pci_eeprom_read(np, here);
    + if (err < 0)
    + return err;
    if (err != 0x90)
    - return;
    + return -EINVAL;

    err = niu_pci_eeprom_read16_swp(np, here + 1);
    if (err < 0)
    - return;
    + return err;

    here = start + offset + 3;
    end = start + offset + err;
    @@ -8181,9 +8189,12 @@ static void niu_pci_vpd_fetch(struct niu
    offset += err;

    err = niu_pci_vpd_scan_props(np, here, end);
    - if (err < 0 || err == 1)
    - return;
    + if (err < 0)
    + return err;
    + if (err == 1)
    + return -EINVAL;
    }
    + return 0;
    }

    /* ESPC_PIO_EN_ENABLE must be set */
    @@ -9274,8 +9285,11 @@ static int niu_get_invariants(struct niu
    offset = niu_pci_vpd_offset(np);
    netif_printk(np, probe, KERN_DEBUG, np->dev,
    "%s() VPD offset [%08x]\n", __func__, offset);
    - if (offset)
    - niu_pci_vpd_fetch(np, offset);
    + if (offset) {
    + err = niu_pci_vpd_fetch(np, offset);
    + if (err < 0)
    + return err;
    + }
    nw64(ESPC_PIO_EN, 0);

    if (np->flags & NIU_FLAGS_VPD_VALID) {

    \
     
     \ /
      Last update: 2021-05-24 18:01    [W:4.117 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site