Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 378041c9 authored by Du Cheng's avatar Du Cheng Committed by Greg Kroah-Hartman
Browse files

ethernet: sun: niu: fix missing checks of niu_pci_eeprom_read()



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: default avatarDu 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: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8ee59089
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -8119,6 +8119,8 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
		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;
@@ -8163,8 +8165,12 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
			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;
@@ -8174,14 +8180,14 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
}

/* 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;

@@ -8190,12 +8196,14 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start)
		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;
@@ -8203,9 +8211,12 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start)
		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 */
@@ -9298,8 +9309,11 @@ static int niu_get_invariants(struct niu *np)
		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) {